插入到容器中的对象必须在析构函数中清除
objects inserted into containers must be cleared at the destructor?
假设:
struct Foo
{
int _b;
std::string _name;
};
class Bar
{
public:
vector<Foo>hold;
};
如果未在析构函数上完成对 hold.clear()
的调用,是否意味着内存泄漏?我说的是对象,而不是指针,因为据我所知,push_back
创建了原始对象的副本;
当一个对象被销毁时,它的所有成员也会被销毁。因此,Bar 的(自动生成的)析构函数将调用其保持成员的析构函数,该成员将调用其元素的析构函数。
总之:一切都会自动销毁。这在C++中是一个保证:如果你按值操作对象,你可以保证当它们超出范围时它们将被销毁。您唯一需要显式销毁的是已在堆上分配的对象(即使用 new)。
不,没有内存泄漏。当Bar
超出范围时,它的数据成员hold
被销毁,并且由于std::vector
设计良好,因此它包含的所有元素都将被销毁。
struct Foo
{
int _b;
std::string _name;
~Foo() { std::cout << "Foo destructor"; }
};
class Bar
{
public:
vector<Foo>hold;
};
int main()
{
{
Bar b;
b.hold.push_back(Foo());
} // Foo, vector<Foo> and b instances destroyed here
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 在不同的线程中调用向量析构函数或清除
- 插入到容器中的对象必须在析构函数中清除
- 是否应始终在析构函数中清除/归零成员数据
- 是否可以在析构函数中清除向量
- 向量:清除/pop_back不会运行析构函数
- 在析构函数上自动安全地清除c++ std::string和std::vector的内容
- 如何使用析构函数清除链表内存,而不会出现valgrind错误?[更新:操作员过载帮助]
- 在c++中使用a方法而不是类自己的析构函数的任何原因都要清除