سؤال

أنا أحاول أن أفهم ما الذي يجري في البرمجية التالية.عندما كائن-حذف يفعل shared_ptr الأعضاء كائن متغير-ب يبقى في الذاكرة لأن وجوه c يحمل shared_ptr إلى كائن-ب ؟

    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-كائن وسوف يكون مرجع 2 بعد c.setRef (المشار إليه من قبل Aالكائن قبل C-الكائن shared_ptr).عندما a حذف في نهاية كتلة ، ثم مرجع من B-كائن قطرات 1 مرة أخرى منذ فقط c's shared_ptr هو الرجوع عليه الآن.

بعد c ودمرت في نهاية الرئيسية ، shared_ptr سوف يتم تدميرها أيضا كجزء من c's الدمار ، مرجع قطرات من الصفر ، وأشار إلى 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)

نصائح أخرى

لا، عندما يتم حذف A، A -> _ B (المؤشر نفسه) سيتوقف عن الوجود.

ال هدف أن -> _ B نقاط سيستمر في الوجود، لأن C._B لا يزال يشير إليه.

الهدف من shared_ptr ستبقى على العيش حتى يتم حذف الإشارة النهائية إليها. في هذه الحالة، سيكون هذا عندما C مثيل يخرج من النطاق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top