如果我们有
n=3;
m=3;
A= new int [n];
for(int i=0;i<n;i++){
A[n] = new int[3];
}
我们可以通过首先在所有行上调用delete []
然后最后delete [] A
来释放内存。为什么我们不能delete [] A
?
A
如何确定它需要释放A[0]
、A[1]
A[2]
所指向的任何内容。
例如,如果我编写一个程序,例如:
auto A = new int* [3];
int i0;
int i1;
int i2;
A[0] = &i0;
A[1] = &i1;
A[2] = &i2;
那么delete [] A
试图做任何事情都是错误的。
在直接内存分配的低级别(也称为直接新建/删除使用(下,由开发人员确定所有内容是否正确。
另一方面,C++提供了各种更高级别的功能以使事情变得更容易。例如能够使用执行适当清理的析构函数将内容包装在类中,以及诸如std::array
、std::vector
、std::unique_ptr
等内容。理想情况下,开发人员将这些东西一起使用,以确保子对象/子分配得到适当的管理。
如果你delete
数组,数组的每个元素都会调用它的析构函数。问题是指针没有析构函数,您需要显式delete
它。