0

认为:

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

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

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

4

2 回答 2

1

不,没有内存泄漏。当 aBar超出范围时,它的数据成员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

}
于 2012-09-21T05:59:30.663 回答
1

当一个对象被销毁时,它的所有成员也会被销毁。因此 Bar 的(自动生成的)析构函数将调用其持有成员的析构函数,该成员将调用其元素的析构函数。

总而言之:一切都会自动销毁。这是 C++ 中的保证:如果您按值操作对象,则可以保证当它们超出范围时它们将被销毁。您唯一需要明确销毁的是已在堆上分配的对象(即使用新对象)。

于 2012-09-21T06:00:46.050 回答