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

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


当前回答

编译器的一种方法是多分配一点内存,并在头元素中存储元素的计数。

举例说明:

Here

int* i = new int[4];

编译器将分配sizeof(int)*5字节。

int *temp = malloc(sizeof(int)*5)

将存储“4”在第一个sizeof(int)字节

*temp = 4;

集合I

i = temp + 1;

i将指向一个包含4个元素的数组,而不是5个。

和删除

delete[] i;

将以以下方式处理:

int *temp = i - 1;
int numbers_of_element = *temp; // = 4
... call destructor for numbers_of_element elements
... that are stored in temp + 1, temp + 2, ... temp + 4 if needed
free (temp)

其他回答

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

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

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

不过,这取决于实现。

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

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

信息没有标准化。然而,在我所研究的平台中,这些信息存储在内存中,就在第一个元素之前。因此,理论上你可以访问它并检查它,但这并不值得。

这也是为什么在使用new[]分配内存时必须使用delete[]的原因,因为数组版本的delete知道(以及在哪里)它需要寻找释放适当数量的内存-并为对象调用适当数量的析构函数。

编译器的一种方法是多分配一点内存,并在头元素中存储元素的计数。

举例说明:

Here

int* i = new int[4];

编译器将分配sizeof(int)*5字节。

int *temp = malloc(sizeof(int)*5)

将存储“4”在第一个sizeof(int)字节

*temp = 4;

集合I

i = temp + 1;

i将指向一个包含4个元素的数组,而不是5个。

和删除

delete[] i;

将以以下方式处理:

int *temp = i - 1;
int numbers_of_element = *temp; // = 4
... call destructor for numbers_of_element elements
... that are stored in temp + 1, temp + 2, ... temp + 4 if needed
free (temp)