0

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

这个对象将不管在数组的末尾是什么,因此移动数组中的其他对象也无关紧要

编辑:

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

4

4 回答 4

4

std::vector如果您需要这样做,您应该使用而不是常规数组。使用std::vector,删除和销毁最终元素是通过该pop_back方法完成的。

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

于 2013-02-15T21:44:58.373 回答
1

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

于 2013-02-15T21:44:19.223 回答
1

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

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

于 2013-02-15T21:41:47.203 回答
0

如果数组像

object* array = new object[n];

然后你不能删除它的一个元素。您可以使用 移动元素memcpy(),但不能更改数组的大小。

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

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

编辑:问题作者的评论指出他想删除指针数组的最后一个元素。

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

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

使用std::vector会更容易。此外,如果您的删除频率足够高,您应该考虑使用std::list.

于 2013-02-15T21:44:44.600 回答