弱智能指针与强智能指针的区别:
weak_ptr也是一个引用计数型的智能指针,但是它不会增加对象的引用计数,即弱引用,而shared_ptr是一个强引用,会增加对象的引用计数,只要有一个指向独享的shared_ptr存在,该对象就不会析构,直到最后一个shared_ptr析构时才会被销毁。
弱智能指针解决了什么问题:
对于shared_ptr来说,它在设计交叉使用时会遇到一个很棘手的问题,如下:
class B;
class A
{
public:
A()
{
cout << "A()" << endl;
}
~A()
{
cout << "~A" << endl;
}
shared_ptr<B> _s_b;
};
class B
{
public:
B()
{
cout << "B()" << endl;
}
~B()
{
cout << "~B()" << endl;
}
shared_ptr<A> _s_a;
};
int main()
{
A* pa = new A();
B* pb = new B();
shared_ptr<A>s_pa(pa);
shared_ptr<B>s_pb(pb);
pa->_s_b = s_pb;
pb->_s_a = s_pa;
}
运行结果:
并没有析构;
由于弱引用不会增加引用计数,这个时候我们只需要把其中的一方设置为弱引用就可解决这个问题
运行结果:
弱指针还可解决指针空悬问题:
有两个指针p1和p2,它们都指向堆上的同一个对象Object,但是p1和p2处于不同的线程中,假设某一时刻,线程A通过p1指针将Object销毁,那么p2就成了空悬指针。
该如何解决这个问题呢?
weak_ptr不控制对象的生命周期,但是它知到对象是否还活着。如果对象还活着,那么他可以提升为有效的shared_ptr(提升操作通过lock()函数获取所管理对象的强引用指针);如果对象已经被销毁了,提升会失败,返回一个空的shared_ptr.
弱智能指针特点:
- 弱智能指针不能直接使用,必须、必须通过强智能指针来提升,不可通过普通指针来提升
- 弱智能指针可隐式构造
- 弱智能指针不增加引用计数
- 使用提升弱智能指针的强智能指针必须是存在的,不能是已经销毁的
例:
int main()
{
shared_ptr<int>s_pa(new int(99));
weak_ptr<int>w_s(new int(99));//错
weak_ptr<int>w_p(s_pa);//显示构造
weak_ptr<int>w_p = s_pa;//隐式构造
shared_ptr<int>s_pb(w_p.lock())//提升弱智能指针
}