【问题标题】:How to implement class destructor with vector of pointers C++如何使用指针向量C++实现类析构函数
【发布时间】:2018-06-20 02:44:01
【问题描述】:

如果我在类中有指针的类和向量,我应该如何编写析构函数来正确释放内存? 对吗?

~Class()
{
  for(int i = 0; i<v.size(); i++)
  {
    delete v[i];
  }
}

或者我也应该从向量中删除元素?还是有其他解决方案?

~Class()
{
  for(int i = 0; i<v.size(); i++)
  {
    delete v[i];
    v.erase(e.begin() + i);
  }
}

【问题讨论】:

  • 使用std::unique_ptr的向量它会为你完成这项工作。
  • 你必须删除vector&lt;int&gt;的元素吗?
  • 如果您正在处理不支持 C++11 的编译器,那么您可以查看::boost::ptr_vector
  • 我认为第一种方法会更好,因为您不需要擦除向量中的元素,向量的析构函数会为您完成

标签: c++ class oop vector destructor


【解决方案1】:

如果我在类中有指针的类和向量,我应该如何编写析构函数来正确释放内存?对吗?

视情况而定。

指针是否指向使用new 分配的对象,并且此类是否是这些动态对象的所有者(即此类是否负责销毁它们)?如果不是,那就不正确了。

或者我也应该从向量中删除元素?

您删除矢量元素的示例是错误的。它会跳过一半的元素,因此不会调用删除所有指针。在第一次迭代之后,第一个元素将被擦除,因此下一个元素已移动到索引 0,但下一个循环删除并擦除索引 1 中的元素。

删除向量的元素是没有意义的,因为它马上就要被销毁了。

或者其他解决方案?

如果你打算让类拥有动态分配的对象,最好使用对象向量而不是指针。例如,如果您需要一个指针向量以允许运行时多态性,则使用std::unique_ptr 的向量。这样你就不需要实现析构函数,因为自动生成就可以了。

【讨论】:

    【解决方案2】:

    如果你的类应该拥有指向的对象,那么它就足够了:

    for (auto p : v) delete p;
    

    如果向量本身是类的成员,那么当类实例对象被销毁时,它的元素会被删除,您不需要手动执行此操作。 在您的示例中,您也做错了。如果它是一个 std::vector,你可以调用 vector 的 clear() 方法。否则你会调用 delete[] p;其中 p 是指向向量元素本身的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 2020-12-27
      • 2018-09-12
      • 2016-05-02
      • 2016-03-20
      • 2013-01-16
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多