weak_ptr介绍
本文转载于http://c.biancheng.net/view/7918.html
在C++98/03的基础上,C++11新标准引入了shared_ptr
、unique_ptr
以及weak_ptr
这3个智能指针。本文介绍weak_ptr
智能指针的特性和用法。
和shared_ptr
以及unique_ptr
类型指针一样,weak_ptr
智能指针也是以模板类的方式实现的。weak_ptr<T>
(T为指针所指数据的类型)定义在<memory>
头文件,并位于std
命名空间中。因此,要想使用weak_ptr
类型指针,程序中应首先包含以下2条语句:
#include <iostream>
using namespace std;
第2句不是必须的,可以不添加,则后续在使用unique_ptr
指针时,必须标注std::
。
需要注意的是,C++11标准虽然将weak_ptr
定位为智能指针的一种,但该类型指针通常不单独使用(实际没有用处),只能和shared_ptr
类型指针搭配使用。甚至于,我们可以将weak_ptr
类型指针视为shared_ptr
指针的一种辅助工具,借助weak_ptr
类型指针,我们可以获取shared_ptr
指针的一些状态信息,比如有多少指向相同的shared_ptr
指针,shared_ptr
指针指向的堆内存是否已经被释放等等。
需要注意的是,当weak_ptr
类型指针的指向和某一shared_ptr
指针相同时,weak_ptr
指针并不会使所指堆内存的引用计数加1;同样,当weak_ptr
指针被释放时,之前所指堆内存的引用计数也不会因此而减1。也就是说,weak_ptr
类型指针并不会影响所指堆内存空间的引用计数。
除此之外,weak_ptr<T>
模板类中没有重载*
和->
运算符,这也就意味着,weak_ptr
类型指针只能访问所指的堆内存,而无法修改它。
1 weak_ptr
指针的创建
创建一个weak_ptr
指针,有以下3种方式:
(1)可以创建一个空的weak_ptr
指针,例如:
std::weak_ptr<int> wp1;
(2)凭借已有的weak_ptr
指针,可以创建一个新的weak_ptr
指针,例如:
std::weak_ptr<int> wp2(wp1);
若wp1
为空指针,则wp2
也为空指针;反之,如果wp1
指向某一shared_ptr
指针拥有的堆内存,则wp2
也指向该块存储空间(可以访问,但无所有权)。
(3)weak_ptr
指针更常用于指向某一shared_ptr
指针拥有的堆内存,因为在构建weak_ptr
指针对象时,可以利用已有的shared_ptr
指针为其初始化。例如:
std::shared_ptr<int> sp(new int);
std::weak_ptr<int> wp3(sp);
由此,wp3
指针和sp
指针有相同的指针。再次强调,weak_ptr
类型指针不会导致堆内存空间的引用计数增加或减少。
2 weak_ptr
模板类提供的成员方法
和shared_ptr<T>
以及unique_ptr<T>
相比,weak_ptr<T>
模板类提供的成员方法不多,下表罗列了常用的成员方法及各自的功能。
成员方法 | 功能 |
---|---|
operator=()
|
重载= 赋值运算符,weak_ptr 指针可以直接被weak_ptr 或者shared_ptr 类型指针赋值。
|
swap(x)
|
其中x 表示一个同类型的weak_ptr 类型指针,该函数可以互换2个共同类型weak_ptr 指针的内容。
|
reset()
|
将当前weak_ptr 指针置为空指针。
|
use_count()
|
查看指向和当前weak_ptr 指针相同的shared_ptr 指针的数量。
|
expired()
|
判断当前weak_ptr 指针是否过期(指针为空,或者指向的堆内存已经被释放)。
|
lock()
|
如果当前weak_ptr 已经过期,则该函数会返回一个空的shared_ptr 指针;反之,该函数返回一个和当前weak_ptr 指针指向相同的shared_ptr 指针。
|
再次强调,weak_ptr<T>
模板类没有重载*
和->
运算符,因此weak_ptr
类型指针只能访问某一shared_ptr
指针指向的堆内存空间,无法对其进行修改。
下面的样例演示了weak_ptr
指针以及上表中部分成员方法的基本用法:
#include <iostream>
#include <memory>using namespace std;int main()
{shared_ptr<int> sp1(new int(10));shared_ptr<int> sp2(sp1);weak_ptr<int> wp(sp2);cout << wp.use_count() << endl; //输出和wp同指向的shared_ptr类型指针的数量sp2.reset(); //释放sp2cout << wp.use_count() << endl; cout << *(wp.lock()) << endl; //借助lock()函数,返回一个和wp同指向的shared_ptr类型指针,获取其存储的数据return 0;
}
程序执行结果为:
2
1
10
weak_ptr介绍相关推荐
- c++ shared_ptr的使用
shared_ptr.是c++为了提高指针安全性而添加的智能指针,方便了内存管理.功能非常强大,非常强大,非常强大(不单单是shared_ptr,配合week_ptr以及enable_share_fr ...
- Effective C++改善程序与设计的55个具体做法笔记
Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...
- RAII技术与智能指针(超详细)
RAII技术与智能指针 RAII技术与智能指针 RAII技术 什么是RAII技术 实现原理 特征 作用 值语义与对象语义的区分 RAII代码格式 测试代码(Computer类的实现) 结论 智能指针 ...
- shared_ptr和weak_ptr使用介绍
文章目录 1 shared_ptr使用介绍 1.1 shared_ptr使用介绍 1.2 shared_ptr的使用陷阱 2 weak_ptr使用简介 1 shared_ptr使用介绍 1.1 sha ...
- C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍
(所有示例的运行,将#序号所在main()函数去掉序号即可,参考[url]http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/ ...
- C++11中weak_ptr的使用
在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...
- 智能指针——weak_ptr
1. 开篇 正式介绍weak_ptr之前,先来复习一下shared_ptr 的一些知识. 我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对象,并维 ...
- C++ 11 创建和使用共享 weak_ptr
1.为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识.我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以 ...
- Boost智能指针——weak_ptr
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string> #include <ios ...
- 【Boost】boost库中智能指针——weak_ptr
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string> #include <ios ...
最新文章
- mysql like 命中索引
- 降维的定义、维度诅咒、降维的意义
- 无缓冲 Chan 的发送和接收是否同步
- 有米android sdk,有米积分墙Android SDK开发者常见问题
- 收银机多少钱一台推荐科脉系统_防火门监控系统安装预算多少钱?防火门监控系统安装预算表[今日推荐]...
- 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
- C++手动实现库函数
- python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
- 后缀是php,后缀php是什么文件
- html树形结构_数据结构-线性表.md
- 中的live_张杰两首歌曲连唱彰显LIVE实力 青春演说温暖人心
- Fortran并行计算的一些例子
- 网络互联课程设计(校园网和企业网)
- Python3—爬虫实现有道在线翻译—(常见错误汇总及解决方法)
- 云编程那些事2 - Java之父的啤酒密谋
- java批量打包下载网络图片
- Web滚动字幕(MARQUEE示例)
- egret可以用php做后端吗,Egret引擎开发指南之创建项目_node.js
- 线扫描枪条码测试机程序,完整倍福PLC程序完整beckhoff倍福PLC ST 语言
- 夸克网盘提取cookie
热门文章
- 电脑蓝牙模式接收手机文件
- 2019计算机就业形势图表分析,2019毕业生就业形势分析
- 使用Python分析英文句子的词性和情感倾向
- 为什么一个操作系统连个进程启动日志都没有
- tensorflow padded_batch的注意事项
- 用Google地图获取地图上某点的经纬度坐标
- 标志设计|标识设计|商标设计|logo设计|的起源
- Array Shrinking(区间DP)
- python-GUI图形界面之Tkinter(常用控件、事件对象、布局管理)
- python打开记事本并输入内容_打开记事本输入文字