为什么不需要手动释放载体?

时间:2013-03-31 21:58:54

标签: c++ memory-management memory-leaks

我只是学习c ++,来自对C和Java的理解。我不太明白为什么我写的一些代码不会泄漏内存。这是代码:

// Foo.h
class Foo {
private:
  std::vector<int> v;
public:
  Foo();
  virtual ~Foo();
  void add_int(int);
}

// Foo.cpp
Foo::Foo(): v () {}
Foo::~Foo() {}

Foo::add_int(int x) {
  v.append(x);
}

存储在v中的向量显然在内部存储了一个指向堆分配内存的指针,需要释放它,但我永远不会释放它。然而,Valgrind表示使用此代码根本不泄漏。我觉得理解为什么会有助于提高我对语言的理解。

4 个答案:

答案 0 :(得分:6)

秘密是C ++的析构函数。你写了一个“什么都不做”(~Foo),但在C ++中,当类被销毁时会自动破坏成员变量。

vector的析构函数只是破坏每个包含的元素,然后释放其内部数组。

答案 1 :(得分:2)

您没有使用v动态分配new,因此无需delete

C ++保证当Foo实例被破坏时会自动销毁成员变量,并且向量会自行排序。

答案 2 :(得分:1)

当向量对象被销毁时,向量类的析构函数将释放内存(当你的Foo对象被销毁时,向量对象本身将被销毁)

答案 3 :(得分:0)

因为你在堆栈上分配了向量,当foo超出范围时,所有它的堆栈变量都会自动调用它们的析构函数。当在向量上调用析构函数时,它将调用其中所有元素的析构函数。

如果你在堆上分配了矢量,你必须手动调用它上面的删除,或者更好的是你可以使用智能指针自动处理它。