質問

私は、次のコードで何が起こっているかを理解しようとしています。オブジェクトAが削除されると、それはオブジェクト-Cオブジェクト-Bをするのshared_ptrを保持しているためshared_ptrのメンバ変数オブジェクト-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;
    }
役に立ちましたか?

解決

A-オブジェクトはすぐaは、そのブロックの終了時に削除されるようにクリーンアップされます。しかし、それが含まれているshared_ptrのは、その後、その参照カウントをインクリメントし、コピーされた。

このように、Bオブジェクトは、(c.setRef対象によって、およびAオブジェクトのCによって参照)shared_ptr後2の参照カウントを有するであろう。 aは、そのブロックの終了時に削除された場合、その後、Bオブジェクトの参照カウントは1のshared_ptrのは、今それを参照しているので、再びcに低下します。

cメインの終了時に破棄された後に、

、そのshared_ptrcの破壊の一部としてあまりにも破壊され、参照カウントがゼロになるように、今、尖った-TO 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)

他のヒント

いいえ、削除された場合、 - > _ B(ポインタ自体)が存在しなくなる

ことののオブジェクト - c._bはまだそれを指しているので> _ B点が、存在し続けるために

それを最終的に参照が削除されるまで、

shared_ptrの目標は、生のままになります。 Cインスタンスがスコープの外に出たとき、この場合、これはなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top