内存释放

3
在以下示例代码中:

可能是重复问题:
delete[]如何“知道”操作数数组的大小?

请问这段代码:

 int* p = new int[10];
 delete[] p;

它如何知道要删除多少个元素?听说这些信息存储在已分配的表开始之前或其他某个地方的一种头文件中 - 但在这种情况下,为什么我们不能通过像size(p)这样的函数访问这个值,它会返回10?有没有特殊的原因?这些头文件中还存储着哪些其他信息?是操作系统特定的?编译器特定的? 谢谢。

@sharptooth,不过OP问得更多。虽然我怀疑真正的答案会难以找到,但这是一个有趣的问题。无论如何,这不是重复内容 - Konrad Rudolph
有趣的事实:如果你定义了::operator delete[](void *, size_t),你实际上可以看到分配区域的真实大小。 - Kerrek SB
3个回答

4

由分配器保存的记账信息绝对是编译器和分配器特定的。C ++允许您全局或按类替换内置分配器。没有标准API可以“窥视”此信息。


问题是,“为什么?” - Konrad Rudolph

4

这是完全未指定的,不同的实现方式也不同。通常情况下,如果类型没有析构函数,则甚至没有可用的信息。

请注意,在幕后有两种不同的信息管理:已分配多少内存以及需要调用多少个具有析构函数的元素。如果没有析构函数,则只需要第一个信息,而且第一个信息和元素数量之间不一定有一对一的映射关系:在许多系统上,例如,对齐约束将意味着new char[1]new char[2]将分配相同数量的内存。


“信息不可用” - 我怀疑。在内存管理的某个层面上,信息必须是可用的,否则它永远无法被释放。 - Konrad Rudolph
@Konrad 数组中元素的数量信息不可用。为了释放内存,系统需要关于分配了多少内存的信息,而不是数组中有多少元素。两者之间的关系并不是一一对应的。 - James Kanze
@James 当然,这是正确的。但是只有在类型不是用户定义类型(UDT)用户没有重载::operator delete[]时才成立。 - Konrad Rudolph
@Konrad 我不确定你想表达什么。为了成功释放内存,系统(或者是执行释放操作的人)需要知道分配的内存量,而不是元素数量。通常情况下,无法从内存量中确定元素数量。至于类型是否为UDF并不会改变我所能看到的任何东西。 - James Kanze
@James,我现在相信了。我仍然认为你在评论中的一些解释应该放在答案中。 - Konrad Rudolph
显示剩余3条评论

0

这几乎是这个问题的重复问题。

如何实现细节将取决于编译器。

至于为什么我们不能询问size(p)的最后一点 - 我想分配器仅存储内存量,而不是数组类型的详细信息。与C的sizeof()相同。它不会返回10,但是在您的平台上存储10个标准int所需的字节数。

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接