C++中delete[]在幕后如何工作?

4

当我们使用new运算符为int数据类型动态分配内存时,使用delete运算符是有意义的。

例如,如果代码如下:

int *p = new int; delete p;

在这里使用delete是有意义的。我们可以想象p指向的内存块被删除/释放。

但是对于下面的代码:

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

在这里使用delete[]是有意义的吗?我问这个问题是因为p不是数组的名称,它只是指向数组内存块的第一个元素的简单指针。现在,delete[]如何工作以删除整个数组呢?由于没有提及数组的大小,那么语句delete[] p;如何删除整个数组。


1
由于p只是一个指针,编译器和标准库并不知道它指向数组的第一个元素,因此您不能使用非数组的delete运算符。编译器和标准库需要知道您正在释放一个数组,这就是为什么您需要使用delete[]的原因。 - Some programmer dude
@Someprogrammerdude 对你的回复:你不能使用非数组删除运算符。但是 delete p; 是可以工作的。 - user11712295
1
尝试创建一个需要调用析构函数的对象数组,它将不再起作用。 new 必须与 delete 匹配,而 new[] 必须与 delete[] 匹配。 - Some programmer dude
1个回答

2

这取决于编译器如何处理。一种比较常见的方法是在分配的内存块之前存储数组的大小,以技术头的形式。

原始答案:Original Answer


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