插入到容器中的对象必须在析构函数中清除

objects inserted into containers must be cleared at the destructor?

本文关键字:析构函数 清除 插入 对象      更新时间:2023-10-16

假设:

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
}