- 前言
- weak_ptr概述
- 创建weak_ptr对象
- 创建空weak_ptr对象
- 使用拷贝构造函数初始化weak_ptr对象
- 使用shared_ptr对象初始化weak_ptr对象
- 注意:不能使用堆指针初始化weak_ptr对象
- weak_ptr成员函数
- weak_ptr运算符
- 使用weak_ptr解决shared_ptr循环引用问题
- 循环引用现象
- 内存空间分析
- weak_ptr解决循环引用
- 后记
本篇继续智能指针weak_ptr的学习。
weak_ptr虽然是智能指针,但实际上是作为shared_ptr的辅助指针使用。
weak_ptr概述weak_ptr通常不单独使用,一般用于查看对应的shared_ptr的信息。weak_ptr没有重载*,->
等指针运算符。
weak_ptr对象不会影响shared_ptr对象的引用计数。
创建weak_ptr对象 创建空weak_ptr对象std::weak_ptr w1;
//std::weak_ptr w1(); // equal
注意:不能使用nullptr构造weak_ptr对象,这一点与shared_ptr,unique_ptr都不同!以下语句将报错:
//std::weak_ptr w1(nullptr); // error!
//std::weak_ptr w2 = nullptr; // error!
使用拷贝构造函数初始化weak_ptr对象
std::weak_ptr w2(w1);
//std::weak_ptr w2 = w1; // equal
使用shared_ptr对象初始化weak_ptr对象
由于weak_ptr是shared_ptr的辅助指针,因此可以通过shared_ptr对象初始化weak_ptr对象:
std::shared_ptr s3(new int(6));
std::weak_ptr w3(s3);
std::weak_ptr w4 = s3;
注意:即使通过shared_ptr对象初始化weak_ptr对象,shared_ptr对象的引用计数也不会发生变化。
注意:不能使用堆指针初始化weak_ptr对象shared_ptr,unique_ptr都可以通过堆指针来初始化对象,但weak_ptr不行。
//std::weak_ptr w5(new double); //error!
weak_ptr成员函数
reset()
使weak_ptr对象变为空指针,类似默认构造函数。(与shared_ptr,unique_ptr的reset不同,weak_ptr的reset不能带参数)。
swap(std::weak_ptr &p)
交换两个weak_ptr对象的内部指针。
use_count()
查看关联shared_ptr的引用计数。
expired()
判断weak_ptr是否过期。如果weak_ptr为空,或者关联的shared_ptr为空,返回true。
lock()
如果weak_ptr对象已过期,返回一个空shared_ptr对象;否则,返回一个weak_ptr内部指针相关联的shared_ptr对象(因此,shared_ptr对象的引用计数+1)。
weak_ptr类只重载了=
赋值运算符,可以把一个shared_ptr或weak_ptr对象赋给另一个weak_ptr对象。
w4 = w3;
使用weak_ptr解决shared_ptr循环引用问题
循环引用现象
shared_ptr的循环引用,是因为shared_ptr对象虽然被销毁,但其引用计数没有变为0,导致开辟的内存没有被释放:
class A;
class B;
class A
{
public:
std::shared_ptr b_;
public:
A(){
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?