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

时间:2012-09-21 05:57:16

标签: c++ memory-leaks containers

假设:

struct Foo
{
    int _b;
    std::string _name;
};

class Bar
{
public:
    vector<Foo>hold;
};

如果没有在析构函数上调用hold.clear(),是否意味着内存泄漏? 我说的是对象,而不是指针,因为据我所知push_back创建了原始对象的副本;

2 个答案:

答案 0 :(得分:1)

不,没有内存泄漏。当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

}

答案 1 :(得分:1)

当一个物体被摧毁时,它的所有成员也被摧毁。因此Bar的(自动生成的)析构函数将调用其hold成员的析构函数,该成员将调用其元素的析构函数。

总结:一切都会自动销毁。这是C ++中的保证:如果您按值操作对象,则可以保证它们在超出范围时将被销毁。你必须明确销毁的是在堆上分配的对象(即使用new)。