Как работает умный указатель? Они запоминают count
интеллектуальных указателей, которые указывают на объект, и увеличивают это count
, когда новый общий указатель берет на себя управление объектом, и уменьшают count
, если общий указатель теряет контроль над объектом.
Предположим, у вас есть класс:
class A{
public:
A(){std::cout << "Object created" << std::endl;}
~A(){std::cout << "Object destroyed" << std::endl;}
void setSibling(boost::shared_ptr<A> &sibling){
m_sibling = sibling;
}
private:
boots::shared_ptr<A> m_sibling;
};
и foo ():
void foo(){
//count increases from 0 to 1 (ptr take control on instance of A)
boost::shared_ptr<A> ptr(new A);
//count increases from 1 to 2 (m_sibling take control on instanse of A)
ptr->setSibling(ptr);
//count decreases from 2 to 1
//(ptr is destroyed and lose control on instance of A)
return;
}
M_sibling потеряет контроль при вызове ~ A (), но ~ A () будет вызываться только тогда, когда все общие указатели потеряют контроль. Итак, после вызова foo вы не можете получить доступ к этому экземпляру A. Но счетчик равен 1, и общий указатель НЕ удалит этот объект, поэтому у вас есть утечка памяти и ресурсов.
См. Документацию для weak_ptr
в усилении, чтобы узнать, как их использовать с shared_ptr
.
Вкратце: слабый указатель похож на общий указатель, но не увеличивает count
. Если у вас есть экземпляр weak_ptr, созданный из shared_ptr
для объекта, который был уничтожен, экземпляр weak_prt выдаст исключение (segfault не произойдет), если вы попытаетесь получить доступ к необработанному указателю. В документации boost есть пример того, как правильно использовать weak_prt
, используя метод weak_ptr::lock()
.
person
JustAnotherCurious
schedule
24.04.2013