3

次のクラスを検討してください。

struct MyClass {
    int mId;
    MyClass(int id): mId(id) {}
   ~MyClass() { std::cout << "deleting: " << mId << std::endl; }
};

そして使用法:

std::shared_ptr<MyClass> p(new MyClass(0));
MyClass& m = *p;
m = MyClass(2);

結果は次のとおりです。

deleting: 2
deleting: 2

理解を助けてください:

  1. オブジェクトが 2 つある理由MyClass(2)(デストラクタ ログでの仮定)
  2. これはメモリリークですか?MyClass(0)漏れてはいけない?

ありがとうございました。

4

2 に答える 2

4

メモリリークはありません。このコード:

m = MyClass(2);

の (デフォルトで生成された) コピー代入演算子を使用して にMyClassコピーされるタイプの一時オブジェクトを作成し、破棄します。最終的にはスコープを使い果たし、そのデストラクタは が指すインスタンス ( にバインドされたインスタンス) を破棄します。mMyClasspMyClassm

すべての暗黙的な呼び出しを明示的に綴ると、次のようになります。

// std::shared_ptr<MyClass> p(new MyClass(0));
tmp1.MyClass(0);
p.shared_ptr(&tmp1);

// MyClass& m = *p;
p.operator* ();

// m = MyClass(2);
tmp2.MyClass(2);
m.operator= (tmp2);
tmp2.~MyClass();

// p goes out of scope
p.~shared_ptr();
tmp1.~MyClass();
于 2013-09-12T15:19:58.270 に答える