对数组中的对象使用delete[]
Using delete [] on an object in an array
如何对数组中的特定类对象使用delete来只删除该对象而不删除整个数组?
这个对象将是阵列末端的任何对象,所以移动阵列中的其他对象也不重要
编辑:
为了使它更加清晰,我只想释放数组的最后一个元素供以后使用。
如果需要,应该使用std::vector
而不是常规数组。对于std::vector
,通过pop_back
方法去除和破坏最终元素。
如果您绝对必须使用常规数组,并且必须立即销毁数组中的一个对象,则可以放置销毁该对象,然后在其位置构造一个新对象。如果您不确定这意味着什么或如何做到这一点,那么您可能应该使用std::vector
。
如果您想将数组的最后一个元素复制到其他地方,只需执行此操作,然后忽略最后一个元件。您无法删除它。通常您在某个位置有一个计数器变量,用于保存数组中当前元素的数量。因此,当您"移除"最后一个元素时,只需将计数器递减1即可。
仅供参考,std::vector
的工作方式完全相同。(无论如何,您应该使用std::vector
开始。)
用new[]
指令分配的数组只能用delete[]
指令释放。释放部分或整个阵列(free
、delete
等)的任何其他尝试都是未定义的行为。如果你想释放数组中的特定元素,那么最好考虑使用stl容器,如std::vector
、std::list
、std::set
、std::map
等。每个容器都有不同的属性,适合不同的任务,但所有元素都支持快速删除(除了vector
,它只支持最后一个元素的"快速"删除,但由于这正是您想要的,因此这是一个很好的选择),并且实际上为您"隐藏"了元素的分配。
如果数组类似
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
。
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- delete如何知道对象在内存中的起始位置
- 如何使用 new 和 delete 与 OpenGL 的缓冲区对象一起使用?
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- WT C 如何为分配的对象调用DELETE
- 正在对自动对象调用delete
- 堆栈对象"delete"的行为是什么?
- 在对象的动态数组上调用 delete [] 不会释放内存?
- 如果我对对象调用 delete,矢量中的对象指针是否被删除
- 当我们在指向未分配 new 运算符的对象的指针上使用 delete 时会发生什么
- 何时调用使用"new"创建的临时对象'delete'?
- 在接收动态数组或堆对象时,我应该使用 delete 还是 delete[]
- "delete this"分配给使用 std::shared_ptr 的对象?
- 在对对象调用 delete 后访问成员函数
- 不在动态分配的对象上调用delete总是内存泄漏
- 在继承中使用delete的意外行为,基指针对象指向派生程度最高的类
- 对指向对象的指针调用delete[]时发生BLOCK_TYPE_VALID错误
- std::unique_ptr<T[]> 使用派生对象数组,使用 delete 函数
- 在此处使用 "delete" 实际上会删除对象吗?
- c++的delete对象create with new,当需要返回时