2010-03-21 181 views
24

数组我已分配和对象删除[]对象

Objects *array = new Objects[N]; 

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

delete[] array; 

或与迭代数组的元素?

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

感谢

UPDATE:

我改变循环体为

delete &array[i]; 

迫使代码进行编译。

+0

这是指针数组还是指针数组? – osgx 2010-03-21 05:23:33

+1

它是指向数组的指针。 – Naveen 2010-03-21 05:27:05

+4

这样做:'delete&array [i];'是不正确的。你没有使用new来分配元素数组[i],所以你不应该删除它。删除整个数组。 – 2010-03-21 08:40:27

回答

38

new的每次使用应平衡为deletenew[]的每次使用应平衡为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; 
} 

您的原始代码给你一个编译错误是一个强烈的暗示,你做错事的事实。

顺便说一句,强制性的:避免与new[]分配数组;取而代之的是使用std::vector,然后它的析构函数会负责为你清理。此外,如果抛出异常,它将不会因内存泄漏而异常安全。

+0

我不能使用矢量。这是一个功课:) – osgx 2010-03-21 05:27:11

+22

不!不要盲目地使用std :: vector来替代数组!这就像说“我有交通需求,所以我会用一辆车。”有时候这是正确的答案,但有时你需要去隔壁,有时你需要从蒙特利尔去莫斯科。在很多情况下,一个数组接近正确的答案,但你想要一个标准库,std :: valarray是你想要的。事实上,在许多情况下,数组是正确的答案。 – 2010-03-21 05:53:25

+7

@Brooks。我可以想到动态分配的数组无法用std :: vector高效替换的情况。这是因为一个std :: vector __IS__数组(唯一的区别是该向量处理所有的内存管理)。如果它是一个静态分配的阵列,那么只需使用一个数组就可以获得很小的性能提升。 – 2010-03-21 08:47:01

6
delete [] array 

就够了。

11

只需delete[] array就足够了。使用delete[]运算符删除数组时,可以保证数组中的每个元素都被删除。

13

一般而言,您应该使用delete/delete[]正是那些与new/new[]分配的值。在这种情况下,您有一个分配new[],所以你应该使用一个电话delete[]再次释放分配的东西。

for-loop中的delete不能编译也很好地表明它们不是正确的方法。

7

不仅是

delete [] array; 

足够了,但如果你

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

你会导致不确定的行为,因为

delete &array[i]; 

将要删除的东西间没有” t由new操作返回。

更不用说后面的delete[] array;将调用析构函数,用于所有刚刚在循环中调用析构函数的对象。

所以不要这样做。