30

次のコードを検討してください。

using boost::shared_ptr;
struct B;
struct A{
    ~A() { std::cout << "~A" << std::endl; }
    shared_ptr<B> b;    
};
struct B {
    ~B() { std::cout << "~B" << std::endl; }
    shared_ptr<A> a;
};

int main() {
    shared_ptr<A> a (new A);
    shared_ptr<B> b (new B);
    a->b = b;
    b->a = a;

    return 0;
}

出力はありません。デストラクタは呼び出されません。メモリーリーク。私は常に、スマート ポインターがメモリ リークの回避に役立つと信じてきました。

クラス内で相互参照が必要な場合はどうすればよいですか?

4

1 に答える 1

59

このような循環参照がある場合、一方のオブジェクトがweak_ptr他方に対して ではなく を保持する必要がありshared_ptrます。

はじめよりshared_ptr:

実装は参照カウントを使用するため、shared_ptrインスタンスのサイクルは回収されません。たとえば、が to をmain()保持shared_ptrA、それが直接的または間接的にshared_ptrtoを保持している場合A、そのA使用回数は 2 になります。元のオブジェクトを破壊すると、使用回数が 1 でぶら下がったshared_ptrままになります 。「サイクルを破る」ために使用します。Aweak_ptr

リンクをありがとう、グレン。

于 2009-12-01T15:28:13.763 に答える