数组我已分配和对象删除[]对象
Objects *array = new Objects[N];
我应该如何删除这个数组的数组? 只是
delete[] array;
或与迭代数组的元素?
for(int i=0;i<N;i++)
delete array[i];
delete[];
感谢
UPDATE:
我改变循环体为
delete &array[i];
迫使代码进行编译。
数组我已分配和对象删除[]对象
Objects *array = new Objects[N];
我应该如何删除这个数组的数组? 只是
delete[] array;
或与迭代数组的元素?
for(int i=0;i<N;i++)
delete array[i];
delete[];
感谢
UPDATE:
我改变循环体为
delete &array[i];
迫使代码进行编译。
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;
}
您的原始代码给你一个编译错误是一个强烈的暗示,你做错事的事实。
顺便说一句,强制性的:避免与new[]
分配数组;取而代之的是使用std::vector
,然后它的析构函数会负责为你清理。此外,如果抛出异常,它将不会因内存泄漏而异常安全。
我不能使用矢量。这是一个功课:) – osgx 2010-03-21 05:27:11
不!不要盲目地使用std :: vector来替代数组!这就像说“我有交通需求,所以我会用一辆车。”有时候这是正确的答案,但有时你需要去隔壁,有时你需要从蒙特利尔去莫斯科。在很多情况下,一个数组接近正确的答案,但你想要一个标准库,std :: valarray是你想要的。事实上,在许多情况下,数组是正确的答案。 – 2010-03-21 05:53:25
@Brooks。我可以想到动态分配的数组无法用std :: vector高效替换的情况。这是因为一个std :: vector __IS__数组(唯一的区别是该向量处理所有的内存管理)。如果它是一个静态分配的阵列,那么只需使用一个数组就可以获得很小的性能提升。 – 2010-03-21 08:47:01
delete [] array
就够了。
只需delete[] array
就足够了。使用delete[]
运算符删除数组时,可以保证数组中的每个元素都被删除。
一般而言,您应该使用delete
/delete[]
正是那些与new
/new[]
分配的值。在这种情况下,您有一个分配new[]
,所以你应该使用一个电话delete[]
再次释放分配的东西。
for-loop中的delete
不能编译也很好地表明它们不是正确的方法。
不仅是
delete [] array;
足够了,但如果你
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
你会导致不确定的行为,因为
delete &array[i];
将要删除的东西间没有” t由new
操作返回。
更不用说后面的delete[] array;
将调用析构函数,用于所有刚刚在循环中调用析构函数的对象。
所以不要这样做。
这是指针数组还是指针数组? – osgx 2010-03-21 05:23:33
它是指向数组的指针。 – Naveen 2010-03-21 05:27:05
这样做:'delete&array [i];'是不正确的。你没有使用new来分配元素数组[i],所以你不应该删除它。删除整个数组。 – 2010-03-21 08:40:27