0

次のコードで何が起こっているのかを理解しようとしています。object-c が object-b への shared_ptr を保持しているため、object-a が削除された場合、その shared_ptr メンバー変数 object-b はメモリに残りますか?

    class B
    {
    public:
       B(int val)
       {
          _val = val;
       }
       int _val;
    };

    class A
    {
    public:
       A()
       {
          _b = new B(121);
       }
       boost::shared_ptr<B> _b;
    };

    class C
    {
    public:
       C()
       {
       }

       void setRef( boost::shared_ptr<B> b)
       {
          _b = b;
       }
       boost::shared_ptr<B> _b;
    };

    int main()
    {
       C c;
       {
          A *a = new A();       
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
          c.setRef(a->_b);
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
                  delete a;
       }
       cout << c._b->_val << endl;
    }
4

3 に答える 3

2

いいえ、a が削除されると、a->_b (ポインター自体) は存在しなくなります。

a->_b が指しているオブジェクトは、 c._b がまだそれを指しているため、存在し続けます。

于 2009-05-21T00:55:22.437 に答える
1

-objectは、ブロックの最後で が削除さAれるとすぐにクリーンアップされます。aしかし、そこに含まれる shared_ptr はその後コピーされ、その参照カウントがインクリメントされました。

したがって、 -object は ( -object および -objectによって参照される)B後に 2 の参照カウントを持ちます。ブロックの最後で が削除されると、 の shared_ptr のみが現在それを参照しているため、 -object の参照カウントは再びに低下します。c.setRefACshared_ptraB1c

cmain の最後で が破棄された後、 の破棄のshared_ptr一部としても破棄さcれ、参照カウントがゼロになると、ポイント先のBオブジェクトが によって削除されshared_ptrます。

したがって、オブジェクトの参照カウントは次のようになりBます。

0: before existence of a.
1: from start of lifetime of a until c.setRef
2: from c.setRef until copy of its parameter
3: from copy of c.setRef''s parameter until return of it
2: from return of c.setRef until end of a''s block
1: from end of a''s block until end of main
0: after main returned (object doesn''t exist anymore now)
于 2009-05-21T00:56:15.273 に答える
0

のターゲットは、shared_ptrそれへの最後の参照が削除されるまでライブのままです。この場合、これはCインスタンスが範囲外になるときです。

于 2009-05-21T00:54:30.300 に答える