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