2

我刚刚学习 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

4 回答 4

6

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

vector的析构函数简单地销毁每个包含的元素,然后释放其内部数组。

于 2013-03-31T22:02:27.430 回答
2

您没有动态分配vwith new,因此不需要delete它。

C++保证Foo实例销毁时成员变量自动销毁,vector自行整理事务。

于 2013-03-31T22:01:52.120 回答
1

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

于 2013-03-31T22:02:29.290 回答
0

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

如果您在堆上分配了向量,您将不得不手动对其进行删除,或者更好的是您可以使用智能指针自动为您处理。

于 2013-04-01T00:19:37.777 回答