繁体   English   中英

删除指针数组

[英]Deleting array of pointers

delete[] a (其中a是动态分配的指针数组)是否对数组中的每个指针执行delete

我想,它为具有用户定义类的数组执行析构函数,但是指针发生了什么?

不, delete []用于删除数组。 如果需要删除数组元素,则需要对每个元素调用delete

不。原始指针不包含有关如何(或是否)释放目标的信息,因此销毁一个永远不会删除目标。

这就是为什么您永远不应该使用它们来管理动态资源的原因——您必须自己完成所有工作,这很容易出错。 相反,您应该使用RAII ,用容器、智能指针和其他管理资源并在销毁时自动释放它们的类替换指针。 std::vector (或std::vector<std::unique_ptr>替换你的动态数组,如果你真的需要单独分配每个对象),一切都将自动解除分配。

不,如果a是动态分配的原始指针数组,则delete[] a; 只是删除存储占领了原始指针数组,但它并没有要求指着对象的析构函数。

所以,如果这些原始指针拥有指针,你就有泄漏:)

使用带有智能指针STL 容器类,例如std::vector<std::unique_ptr<X>> ,以获得更现代和更简单的方法:通过这种方式,您可以获得异常安全性和两个数组的自动销毁指针和指向的对象。

delete[]调用数组每个元素的析构函数 由于指针是一种基本类型,它实际上没有析构函数,因此它什么也不做。

这正是使用智能指针的原因: delete[]将调用每个元素的析构函数,智能指针的析构函数将调用托管指针上的delete

所以: 了解智能指针并停止手动管理内存。 它更容易,更不容易出错,而且级别更低。

delete[] 只会删除数组中的元素,不会删除数组元素指向的内存。 如果要删除数组元素指向的内存

  1. 通过对每个数组元素调用 delete 来显式删除每个内存
  2. 然后通过 delete[] 运算符删除数组

不, delete[]只释放由new[]创建的数组

有关更多信息,请参阅参考资料。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM