【发布时间】:2011-07-21 21:44:21
【问题描述】:
delete 如何知道它需要释放多少字节?
我读到在 new 返回的实际指针地址之前有一些块,其中包含块地址详细信息。
这里有谁知道这个块有多少字节或者那个块的格式是什么?
【问题讨论】:
标签: c++ memory-management
delete 如何知道它需要释放多少字节?
我读到在 new 返回的实际指针地址之前有一些块,其中包含块地址详细信息。
这里有谁知道这个块有多少字节或者那个块的格式是什么?
【问题讨论】:
标签: c++ memory-management
一般来说,这取决于实现。
这通常实现的方式是 new/malloc 将分配比您要求的稍多的字节,并将使用额外的字节进行一些记账:很多时候分配的块也将在链表中维护,因此额外的字节将用于存储下一个/上一个指针,以及块的大小。
但是,这不是强制性的。 new/malloc 调用也可以将指针和块的大小存储在地图中。
如果您对特定实现感兴趣,则必须提供更多信息(例如,您使用的是什么运行时/编译器?)。
【讨论】:
new 运算符和 malloc 函数以它们自己特定的方式处理内存,所以
如果你一定会尝试弄乱 malloc 或 new 的内部工作(这似乎是你的目标),那么你做错了 ^ ^
【讨论】:
这个问题没有唯一的正确答案,因为它取决于具体情况。在某些情况下,编译器在编译时就知道对象的大小,因此 delete 知道要释放多少字节。在编译时不知道内存大小的情况下,要么涉及内存映射,要么像您自己建议的那样,在指针前面有一个单词,它告诉分配的字节数。
我相信其中很多都是特定于实现的,而不是您可以依赖的特定方式。这个问题和one非常相似。
【讨论】:
delete 运算符来获取大小(而不是通过指针获取它),编译器必须能够找到对new 的所有调用以及对delete 的相应调用。此指针不得转义并被普通delete 删除,并且此特殊删除不得删除普通指针。您有执行此操作的编译器的具体示例吗?