如何使用指针向量实现类析构函数 C++.
How to implement class destructor with vector of pointers 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 是指向矢量元素本身的指针。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误