2011-03-24 60 views

回答

4

一般来说,这是依赖于实现的。

通常实现的方式是new/malloc将分配比您要求的更多的字节,并且会使用额外的字节来保存一些书籍:多次分配的块也将保持链接状态,列表,所以额外的字节将用于存储下一个/ prev指针,以及块的大小。

然而,这不是强制性的。新的/ malloc调用可以将指针和块的大小存储在地图中。

如果您对特定实现感兴趣,您将不得不提供更多信息(例如,您使用的是什么运行时/编译器?)。

1

运营商,以自己的特殊方式的malloc功能处理内存,所以

  • ,如果你与“新”使用“删除”
  • 如果你分配的内存与分配的内存“的malloc “使用‘免费’
  • ,如果你不知道如何/谁/在内存已分配,不释放它

如果你一定要尽量乱用的malloc(这似乎是你的目标)的内部工作,你这样做是错误的^^

0

有没有一个正确的答案了问题因为它取决于情况。在某些情况下,编译器在编译时知道对象的大小,因此删除知道要释放多少个字节。在编译时不知道内存大小的情况下,可能涉及内存映射,或者如您自己所建议的那样,指针之前的一个字指示分配的字节数。

我相信很多这是实现特定的,而不是您可以依赖的具体方法。这个问题与这个one非常相似。

+0

您确定“在某些情况下,编译器知道编译时对象的大小,因此删除知道要释放多少个字节”部分?我不认为这是可能的,甚至如果这会要求系统二能够以两种不同的方式在堆上分配事物。 – Lindydancer 2011-03-24 07:17:06

+0

@Lindydancer - 好吧,当然是!这没有什么错。例如sizeof关键字用于在编译时确定对象的大小。并且编译器根据分配或取消分配的类型生成不同的代码并不是特别牵强。所有这些都是实现特定的。 – 2011-03-24 08:18:02

+0

@John - 我问的原因是因为我一直在编写C/C++编译器超过10年,而我从未见过这个。由于需要一个特殊的'delete'操作符来获取大小(而不是通过指针拾取它),编译器必须能够找到所有对'new'的调用以及对'delete'的相应调用。这个指针不能被正常的'delete'转义并被删除,这个特殊的删除不能删除一个正常的指针。你有一个这样做的编译器的具体例子吗? – Lindydancer 2011-03-24 09:33:24