对数组中的对象使用delete[]

Using delete [] on an object in an array

本文关键字:delete 对象 数组      更新时间:2023-10-16

如何对数组中的特定类对象使用delete来只删除该对象而不删除整个数组?

这个对象将是阵列末端的任何对象,所以移动阵列中的其他对象也不重要

编辑:

为了使它更加清晰,我只想释放数组的最后一个元素供以后使用。

如果需要,应该使用std::vector而不是常规数组。对于std::vector,通过pop_back方法去除和破坏最终元素。

如果您绝对必须使用常规数组,并且必须立即销毁数组中的一个对象,则可以放置销毁该对象,然后在其位置构造一个新对象。如果您不确定这意味着什么或如何做到这一点,那么您可能应该使用std::vector

如果您想将数组的最后一个元素复制到其他地方,只需执行此操作,然后忽略最后一个元件。您无法删除它。通常您在某个位置有一个计数器变量,用于保存数组中当前元素的数量。因此,当您"移除"最后一个元素时,只需将计数器递减1即可。

仅供参考,std::vector的工作方式完全相同。(无论如何,您应该使用std::vector开始。)

new[]指令分配的数组只能用delete[]指令释放。释放部分或整个阵列(freedelete等)的任何其他尝试都是未定义的行为。如果你想释放数组中的特定元素,那么最好考虑使用stl容器,如std::vectorstd::liststd::setstd::map等。每个容器都有不同的属性,适合不同的任务,但所有元素都支持快速删除(除了vector,它只支持最后一个元素的"快速"删除,但由于这正是您想要的,因此这是一个很好的选择),并且实际上为您"隐藏"了元素的分配。

如果数组类似

object* array = new object[n];

则不能删除其中的元素。可以使用memcpy()移动元素,但不能更改数组的大小。

在大多数情况下,对数组项使用newdelete会导致堆损坏。按照建议,您应该使用std::vector

如果数组是指向对象的指针数组,则可以delete指向对象,但不能删除指针本身(请参阅本答案的第一部分)。

编辑:问题作者的注释指定他要删除指针数组的最后一个元素。

您可以将最后一个指针设置为0并检查:

pointers[size - 1] = 0;
// later, when using the array
if(pointers[i]) // do smth

使用std::vector将更容易。此外,如果删除频率足够高,则应考虑使用std::list