Foo* set = new Foo[100];
// ...
delete [] set;

您不需要传递数组的边界来删除[]。但是这些信息存储在哪里呢?它是标准化的吗?


当前回答

因为要“删除”的数组应该是用“new”操作符创建的。'new'操作应该已经将该信息放到堆上。否则,new的其他用法如何知道堆的结束位置?

其他回答

它不是标准化的。在微软的运行时,new操作符使用malloc(), delete操作符使用free()。因此,在此设置中,您的问题相当于以下内容:free()如何知道块的大小?

在幕后,也就是在C运行时,会进行一些簿记工作。

当你在堆上分配内存时,你的分配器会跟踪你已经分配了多少内存。它通常存储在分配内存之前的“head”段中。这样,当需要释放内存时,解分配器确切地知道需要释放多少内存。

这是一个比你最初想象的更有趣的问题。这个回复是关于一个可能的实现。

首先,在某种程度上,你的系统必须知道如何“释放”内存块,底层的malloc/free (new/delete/new[]/delete[]通常调用)并不总是准确地记住你需要多少内存,它可以四舍五入(例如,一旦你超过4K,它通常四舍五入到下一个4K大小的块)。

因此,即使可以得到内存块的大小,也不能告诉我们在新的[]ed内存中有多少值,因为它可以更小。因此,我们必须存储一个额外的整数来告诉我们有多少个值。

除非,如果被构造的类型没有析构函数,那么delete[]除了释放内存块外什么都不用做,因此不需要存储任何东西!

基本上它在内存中的排列方式是:

[信息][mem你要的是…]

这里的info是编译器用来存储分配的内存量的结构。

不过,这取决于实现。

这不是规范中的内容——它取决于实现。