【问题标题】:Deleting array of pointers删除指针数组
【发布时间】:2014-02-12 15:17:10
【问题描述】:

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

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

【问题讨论】:

  • 不,它只会删除数组。如果要删除所有指针,则必须遍历并删除数组包含的所有指针。
  • 更好的是,使用 std::vector (最好不要每个元素都是指针)。
  • 我知道std::vector,我想自己写类似的类。
  • 不,你不应该在容器中存储指针
  • 您可以使用智能指针数组删除delete[] a上数组的每个元素。

标签: c++ arrays pointers delete-operator


【解决方案1】:

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

【讨论】:

  • 可能在删除数组之前 ;-)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    不,如果a 是一个动态分配的原始指针数组delete[] a; 只是删除原始指针数组占用的内存,但它确实不是 为指向的对象调用析构函数。

    所以,如果这些原始指针是拥有指针,那么你就有leaktrocity :)

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

    【讨论】:

      【解决方案4】:

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

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

      所以:learn about smart pointers 并停止手动管理内存。它更容易,更不容易出错,而且级别更低。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          See the reference for more informations.

          【讨论】:

          • 它不只是“释放数组”,它还破坏了数组元素。
          • @KerrekSB 但不是数组元素指向的对象。
          猜你喜欢
          • 2015-08-09
          • 1970-01-01
          • 2013-04-22
          • 2011-05-10
          • 2015-07-15
          • 1970-01-01
          • 2011-02-18
          • 2017-01-18
          相关资源
          最近更新 更多