0

私は自分自身にC++を教え始めており、ガベージコレクターなしでオブジェクトを処理する方法が混乱を引き起こしています。これが私がやろうとしていることの簡単なケースです:

A* a;
B b = new B(a);    // Note that B is a derived class of A
a = &b;

while (a != NULL)
{
    (*a).run();
}

これはすべて、私が期待するとおりに機能します。私が問題を抱えているのは、Bのrun()メソッド内で、次のようなことをしたいということです。

C c = new C(a);  // a is the same pointer as above, that has been stored 
                 // and C another derived class from A
a = &c;

次に、run()を終了します。次に、最初のブロックのwhileループは、新しいオブジェクトに対してrun()を呼び出します。私の質問は、元のbのメモリが正しく割り当て解除されていることを確認するにはどうすればよいですか?

4

2 に答える 2

1

動的メモリ割り当てと重要な所有権セマンティクスに直面するときはいつでも、スマートポインターが正確さを保証するための良い方法であることがよくあります。

たとえば、を参照してくださいstd::shared_ptr

于 2013-01-05T21:44:29.750 に答える
1

この場合に使用できますstd::shared_ptr。2つのクラスに、同じオブジェクトを指す必要のあるメンバーがある場合は、両方を作成できますshared_ptr。そして、これは通常行いますが、そうしているときに循環依存を作成しようとしている場合、その循環依存を破るには、が必要std::weak_ptrです。

std::shared_ptrこれがとの例ですstd::weak_ptr

間違ったコード(循環依存):

struct B;

struct A
{
   std::shared_ptr<B> bp;
}

struct B
{
   std::shared_ptr<A> ba;  //this creates a cyclic dependency.
}

正しいコード(非周期的):

struct B;

struct A
{
   std::shared_ptr<B> bp;
}

struct B
{
   std::weak_ptr<A> ba;  //break cyclic dependency with std::weak_ptr
}
于 2013-01-05T21:45:34.677 に答える