我已经分配了对象数组
Objects *array = new Objects[N];
我该如何删除这个数组? 只是
delete[] array;
或迭代数组的元素?
for(int i=0;i<N;i++)
delete array[i];
delete[];
由于
更新:
我将循环体改为
delete &array[i];
强制代码编译。
答案 0 :(得分:42)
new
的每次使用均应由delete
平衡,new[]
的每次使用都应由delete[]
平衡。
for(int i=0;i<N;i++)
delete array[i];
delete[] array;
仅当您将数组初始化为:
时才适用Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) {
array[i] = new Object;
}
你的原始代码给你一个编译错误的事实强烈暗示你做错了。
BTW,强制性的:避免使用new[]
分配数组;改为使用std::vector
,然后它的析构函数将为您进行清理。此外,如果抛出异常,则不会泄漏内存,因此它将是异常安全的。
答案 1 :(得分:14)
只需delete[] array
即可。使用delete[]
运算符删除数组时,可以保证删除数组的每个元素。
答案 2 :(得分:13)
作为一般规则,您应该delete
/ delete[]
完全按照new
/ new[]
分配的内容。在这种情况下,您有一个new[]
分配,因此您应该使用delete[]
的一次调用来再次释放该分配的内容。
for循环中的delete
s将无法编译,这也表明它们不是正确的方法。
答案 3 :(得分:8)
不仅是
delete [] array;
足够,但如果你这样做
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
你将导致未定义的行为,因为
delete &array[i];
将删除new
操作未返回的内容。
更不用说后续的delete[] array;
将为所有在循环中调用析构函数的对象调用析构函数。
所以不要这样做。
答案 4 :(得分:7)
delete [] array
就够了。