删除[]一个对象数组

时间:2010-03-21 05:16:35

标签: c++ arrays new-operator delete-operator

我已经分配了对象数组

Objects *array = new Objects[N];

我该如何删除这个数组? 只是

delete[] array;

或迭代数组的元素?

for(int i=0;i<N;i++)
    delete array[i];
delete[];

由于

更新:

我将循环体改为

delete &array[i];

强制代码编译。

5 个答案:

答案 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

就够了。