本篇作为weak_ptr提出的文章,首先看以下代码的运行结果。
int _tmain(int argc, _TCHAR* argv[])
{
//定义智能指针sptr指向new int(3)
std::shared_ptr<int> sptr(new int(3));
//sptr赋给sptr2,两个指针指向int(3) 引用计数变为2
std::shared_ptr<int> sptr2 = sptr;
//将wptr弱指针与强指针联系起来
std::weak_ptr<int> wptr = sptr;
//弱指针要使用强指针
//(!wptr.expired())判断弱指针是否与强指针关联 并且强指针是存在的
//wptr.lock()将弱指针提升为强指针
if (!wptr.expired()) {
std::shared_ptr<int> sptr3 = wptr.lock();
}
return 0;
}
强指针的引用计数: 有一个弱指针存在关联着这个强指针 对弱指针进行提升 本篇考虑一个问题:问题1:为什么会存在强弱指针的计数 (1)强指针的循环引用 首先看一个之前写的一个的抽象的循环引用
A{
B对象智能指针(引用计数 2)
}
B{
A对象智能指针(引用计数2)
}
构造: A对象在创建时引用计数为1,由于其内部有B的对象,B对象内部又有A对象,因此A对象的引用计数为2,同理B的引用计数为2
释放: A释放时,引用计数减2-1,但是B中又有A对象,引用计数还为1,A不能完全释放,同理B也是
为了打破这个引用循环,要使得A B中一个的引用计数减1次 (2)弱指针的使用
- 引用计数减1也会导致统计次数不准,为了解决统计次数不准的问题,引入了弱指针
- 弱指针与强指针是关联的,但是它不能直接使用,需要使用.lock函数进行提升,增加强指针的引用次数
- 提升将强指针的次数+1,但是不会影响弱指针表达出的原强指针的引用次数仍为1
A{
B对象弱智能指针(引用计数 1) weak_ptr_uses_count
}
B{
A对象智能指针(引用计数 2) shared_ptr_uses_count
}
学习视频地址: weak_ptr的提出及解决循环引用的思路
|