boost::shared_ptr использование_count
-
23-08-2019 - |
Вопрос
Я пытаюсь понять, что происходит в следующем коде.Когда объект-a удаляется, остается ли его переменная-член shared_ptr object-b в памяти, потому что object-c содержит 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;
}
Решение
В A
-объект будет очищен, как только a
удаляется в конце своего блока.Но содержащийся в нем shared_ptr впоследствии был скопирован, увеличив его количество ссылок.
Таким образом, B
-объект будет иметь количество ссылок равное 2 после c.setRef
(на который ссылается A
-объект и с помощью C
-объект shared_ptr
).Когда a
удаляется в конце своего блока, тогда количество ссылок в B
-объект падает на 1
опять же, поскольку только c
shared_ptr сейчас ссылается на это.
После c
уничтожается в конце main, его 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)
Другие советы
Нет, когда a будет удален, a->_b (сам указатель) перестанет существовать.
В объект то, на что указывает a-> _b, будет продолжать существовать, потому что c._b все еще указывает на это.
Цель этого shared_ptr
будет оставаться активным до тех пор, пока не будет удалена последняя ссылка на него.В этом случае это произойдет, когда C
экземпляр выходит за пределы области видимости.