如果我在类中有类和指针向量,我应该如何编写析构函数以正确释放内存? 这是对的吗?
~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);
}
}
答案 0 :(得分:4)
如果我在类中有类和指针向量,我应该如何编写析构函数以正确释放内存?这是对的吗?
取决于。
指针是否指向使用new
分配的对象,并且此类是这些动态对象的所有者(即此类是否负责销毁它们)?如果没有,那就不正确了。
或者我是否也应该从矢量中删除元素?
用于擦除向量元素的示例是错误的。它将跳过一半元素,因此不会调用delete所有指针。在第一次迭代之后,第一个元素将被擦除,因此下一个元素已被移位到索引0,但是下一个循环删除并擦除索引1中的元素。
删除矢量元素毫无意义,因为它会立即被破坏。
或其他任何解决方案?
如果您打算让类拥有动态分配的对象,则更喜欢使用对象向量而不是指针。如果你需要一个指针向量,例如允许运行时多态,那么使用std::unique_ptr
的向量。这样你就不需要实现析构函数了,因为自动生成就好了。
答案 1 :(得分:0)
如果你的类应该拥有指向的对象,那么它就足够了:
for (auto p : v) delete p;
如果向量本身是类的成员,那么当类实例对象被销毁时,它的元素将被删除,您不需要手动执行此操作。 在你的例子中,你也做错了。如果它是一个std :: vector,你可以调用vector的clear()方法。否则你会调用delete [] p;其中p是指向向量元素本身的指针。