دفعة::shared_ptr use_count
-
23-08-2019 - |
سؤال
أنا أحاول أن أفهم ما الذي يجري في البرمجية التالية.عندما كائن-حذف يفعل 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
مثيل يخرج من النطاق.