Foo* set = new Foo[100];
// ...
delete [] set;
您不需要传递数组的边界来删除[]。但是这些信息存储在哪里呢?它是标准化的吗?
Foo* set = new Foo[100];
// ...
delete [] set;
您不需要传递数组的边界来删除[]。但是这些信息存储在哪里呢?它是标准化的吗?
当前回答
它不是标准化的。在微软的运行时,new操作符使用malloc(), delete操作符使用free()。因此,在此设置中,您的问题相当于以下内容:free()如何知道块的大小?
在幕后,也就是在C运行时,会进行一些簿记工作。
其他回答
基本上它在内存中的排列方式是:
[信息][mem你要的是…]
这里的info是编译器用来存储分配的内存量的结构。
不过,这取决于实现。
它不是标准化的。在微软的运行时,new操作符使用malloc(), delete操作符使用free()。因此,在此设置中,您的问题相当于以下内容:free()如何知道块的大小?
在幕后,也就是在C运行时,会进行一些簿记工作。
因为要“删除”的数组应该是用“new”操作符创建的。'new'操作应该已经将该信息放到堆上。否则,new的其他用法如何知道堆的结束位置?
这不是规范中的内容——它取决于实现。
编译器的一种方法是多分配一点内存,并在头元素中存储元素的计数。
举例说明:
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)