:: shared_ptrのはuse_count後押し
-
23-08-2019 - |
質問
私は、次のコードで何が起こっているかを理解しようとしています。オブジェクト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_ptr
はc
の破壊の一部としてあまりにも破壊され、参照カウントがゼロになるように、今、尖った-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
インスタンスがスコープの外に出たとき、この場合、これはなります。
所属していません StackOverflow