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



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

~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 是指向矢量元素本身的指针。

最新更新