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

时间:2013-02-15 21:37:07

标签: c++

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

这个对象无论在数组的末尾都是什么,所以移动数组中的其他对象也无关紧要

编辑:

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果数组是

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