如何使用指针C ++向量实现类析构函数

时间:2018-01-10 20:42:18

标签: c++ class oop vector destructor

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

~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);
  }
}

2 个答案:

答案 0 :(得分:4)

  

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

取决于。

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

  

或者我是否也应该从矢量中删除元素?

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

删除矢量元素毫无意义,因为它会立即被破坏。

  

或其他任何解决方案?

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

答案 1 :(得分:0)

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

for (auto p : v) delete p;

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