Foo* set = new Foo[100];
// ...
delete [] set;
您不需要传递数组的边界来删除[]。但是这些信息存储在哪里呢?它是标准化的吗?
Foo* set = new Foo[100];
// ...
delete [] set;
您不需要传递数组的边界来删除[]。但是这些信息存储在哪里呢?它是标准化的吗?
当前回答
信息没有标准化。然而,在我所研究的平台中,这些信息存储在内存中,就在第一个元素之前。因此,理论上你可以访问它并检查它,但这并不值得。
这也是为什么在使用new[]分配内存时必须使用delete[]的原因,因为数组版本的delete知道(以及在哪里)它需要寻找释放适当数量的内存-并为对象调用适当数量的析构函数。
其他回答
这不是规范中的内容——它取决于实现。
基本上它在内存中的排列方式是:
[信息][mem你要的是…]
这里的info是编译器用来存储分配的内存量的结构。
不过,这取决于实现。
因为要“删除”的数组应该是用“new”操作符创建的。'new'操作应该已经将该信息放到堆上。否则,new的其他用法如何知道堆的结束位置?
当你在堆上分配内存时,你的分配器会跟踪你已经分配了多少内存。它通常存储在分配内存之前的“head”段中。这样,当需要释放内存时,解分配器确切地知道需要释放多少内存。
它不是标准化的。在微软的运行时,new操作符使用malloc(), delete操作符使用free()。因此,在此设置中,您的问题相当于以下内容:free()如何知道块的大小?
在幕后,也就是在C运行时,会进行一些簿记工作。