删除[]一个对象数组

osg*_*sgx 31 c++ arrays new-operator delete-operator

我已分配和对象数组

Objects *array = new Objects[N];
Run Code Online (Sandbox Code Playgroud)

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

delete[] array;
Run Code Online (Sandbox Code Playgroud)

或者迭代数组的元素?

for(int i=0;i<N;i++)
    delete array[i];
delete[];
Run Code Online (Sandbox Code Playgroud)

谢谢

更新:

我改变了循环体

delete &array[i];
Run Code Online (Sandbox Code Playgroud)

强制代码编译.

jam*_*lin 44

每次使用都new应该用a来平衡delete,每次使用new[]都要平衡delete[].

for(int i=0;i<N;i++)
    delete array[i];
delete[] array;
Run Code Online (Sandbox Code Playgroud)

只有在将数组初始化为:

Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) { 
    array[i] = new Object;
}
Run Code Online (Sandbox Code Playgroud)

您的原始代码给出了编译错误的事实强烈暗示您做错了什么.

BTW,强制性的:避免分配数组new[]; 使用std::vector,然后它的析构函数将为您清理.此外,如果抛出异常,则不会泄漏内存,因此它将是异常安全的.

  • 没有!不要盲目地使用std :: vector作为数组的替代品!这就像是说"我有运输需求,所以我会用车." 有时它是正确的答案,但有时你需要去隔壁,有时你需要从蒙特利尔到莫斯科.在许多情况下,如果数组接近正确的答案,但您需要标准库,那么std :: valarray就是您想要的.事实上,在许多情况下,阵列是正确的答案. (27认同)
  • @Brooks.我可以想到使用std :: vector无法有效替换动态分配的数组的任何情况.这是因为std :: vector __IS__是一个数组(唯一的区别是向量处理所有的内存管理).如果它是静态分配的数组,只需使用数组就可以获得微小的性能提升. (7认同)

Nav*_*een 14

delete[] array 足够了.使用delete[]operator 删除数组时,可以保证删除数组的每个元素.


sth*_*sth 13

作为一般规则,你应该delete/ delete[]确切地说你用new/ 分配的东西new[].在这种情况下,你有一个分配new[],所以你应该使用一个调用来delete[]再次释放分配的东西.

deletefor循环中的s不会编译也很好地表明它们不是正确的方法.


Mic*_*urr 8

不仅如此

delete [] array;
Run Code Online (Sandbox Code Playgroud)

够了,但如果你这样做的话

for(int i=0;i<N;i++)
    delete &array[i];
delete[] array;
Run Code Online (Sandbox Code Playgroud)

你会导致未定义的行为,因为

delete &array[i];
Run Code Online (Sandbox Code Playgroud)

将删除操作未返回的内容new.

更不用说后续delete[] array;将为析构函数调用所有在循环中调用析构函数的对象.

所以不要这样做.