2

C と Java の両方を理解した上で、C++ を学んでいます。私が書いたコードの一部がメモリ リークしない理由がよくわかりません。コードは次のとおりです。

// 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

0

スタックにベクターを割り当てたので、foo がスコープ外になると、すべてのスタック変数のデストラクタが自動的に呼び出されます。ベクトルでデストラクタが呼び出されると、その中のすべての要素のデストラクタが呼び出されます。

ヒープにベクトルを割り当てた場合は、手動で削除を呼び出す必要がありましたが、スマート ポインターを使用して自動的に処理することもできました。

于 2013-04-01T00:19:37.777 に答える