智能指针和异常、 weak_ptr、unique_ptr
12.1.4智能指针和异常
1.在块中创建的动态内存,如果是由内置指针来指向这块内存,那么若是在块结束时未delete这个指针,则该内存不会被释放,若在delete之前发生异常,由于还没执行delete操作,内存也不会被释放;但若是由智能指针来指向这块内存,那无论是否发生异常,都能在正确时间释放内存,正常是在块结束处,异常则是在异常处。
2.使用智能指针应遵守的规范:
(1)不使用相同的内置指针初始化(或reset)多个智能指针。
(2)不delete get()返回的指针。
(3)不使用get()初始化或reset另一个智能指针。
(4)如果你使用get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。
(5)如果智能指针管理的资源不是new分配的内存,应传递给它一个删除器。
12.1.5 unique_ptr
1.Unique_ptr的定义有两种初始化方式:
Unique_ptr<T> p(new T ())和unique_ptr<T> p(q),q是一个指向动态分配的对象的指针,
2.unique_ptr指针不能简单拷贝和赋值,只能通过release成员和reset成员来转移对象的所有权。p.release()返回一个指向原对象的unique_ptr指针,并将p 指针置空,p.reset(q)作用和shared_ptr的reset成员一样,若参数列表为空则释放p指向的对象,否则释放p指向的对象后,令p指向q所指对象。两个函数通常的搭配为p2.reset(p3.release()).
3.unique_ptr虽然一般不能拷贝和赋值,但有例外,我们可以拷贝或赋值一个将要被销毁的unique_ptr,常见的例子是从函数中返回一个unique_ptr或一个局部对象的拷贝。
4.u = nullptr释放u指向的对象,将u置为空。
5.重载删除器,unique_ptr<T, D> u(d);用类型为D的对象d代替delete释放u所指对象并将u置空。
12.1.6 weak_ptr
1.weak_ptr必须绑定到一个shared_ptr,但是它不会使shared_ptr的引用计数增加,一旦最后一个指向对象的shared_ptr被其析构函数或其他自定义的可调用函数delete掉,那么该内存对象就会被释放,因为这个性质,所以它不能控制对象的生存周期,不能改变对象的任何属性,只起一个指向的作用。
2.不能解引用一个weak_ptr指针,也不能用cout输出一个weak_ptr的内容,也就是对象的地址。(原因有待探索)
3.常用成员函:w.expired(),其绑定的共享指针数量为0,则返回真,否则返回假;w.lock(),绑定的共享指针数量为0,则返回一个空的共享指针,否则返回一个指向对象的共享指针。
4.创建一个weak_ptr时,要用一个shared_ptr来初始化它:weak_ptr<int> wp(p);
weak_ptr<int> wp(make_shared<int>(12));虽然合法,但是因为weak_ptr是弱共享,无法对对象进行任何操作,所以这样定义是没有意义的,此情况下不能用一个weak_ptr来初始化一个shared_ptr,但若是weak_ptr原来就绑定了其他共享指针,则可以初始化一个shared_ptr.
智能指针和异常、 weak_ptr、unique_ptr的更多相关文章
- 智能指针思想实践(std::unique_ptr, std::shared_ptr)
1 smart pointer 思想 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ...
- C++ 智能指针(shared_ptr/weak_ptr)原理分析
其主要的类关系如下所示(省略相关的类模板参数): 图1 从上面的类图可以清楚的看出shared_ptr内部含有一个指向被管理对象(managed object)T的指针以及一个__shared_cou ...
- c++ 智能指针用法详解
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用. 为什么要使用智能 ...
- C++ 智能指针学习
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- C++智能指针总结
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用. 为什么要使用智能 ...
- C++ Primer : 第十二章 : 动态内存之shared_ptr与new的结合使用、智能指针异常
shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> ...
- 异常处理与MiniDump详解(2) 智能指针与C++异常
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一. 综述 <异常处理与MiniDump详解(1) C++异常>稍 ...
- C++智能指针简单剖析
导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...
- C++智能指针初学小结
本篇随笔仅作为个人学习<C++ Primer>智能指针一节后的部分小结,抄书严重,伴随个人理解.主要介绍shared_ptr.make_shared.weak_ptr的用法和联系. C++ ...
随机推荐
- Java开学测试-学生成绩管理系统
题目: 1.定义 ScoreInformation 类,其中包括七个私有变量(stunumber, name, mathematicsscore, englishiscore,networkscore ...
- MySQL的数据库备份
MySQL的数据库备份 备份的原因: 1.保证重要数据不丢失 2.数据转移 MySQL数据库备份方式: 1.方法1:在Sqlyog这种可视化工具中手动导出 2.方法2:直接拷贝物理文件(就是data文 ...
- 安装CPULimit到Linux(源码)
运行环境 适用系统:所有Linux系统 当前版本:无 硬件要求:无 安装过程 1.安装依赖 root@localhost:~# apt-get -y install git 2.从GitHUB中克隆源 ...
- iPad成为Windows系统的第二屏幕
一.Windows端软件准备 1.Splashtop Wired XDisplay Agent (官网下载 快速下载) 2.iTunes (点击此处跳转至微软应用商店) 二.iPad端软件准 ...
- PHPMailer发送邮件遇坑小记
一:phpmailer发送邮件成功了 数据库发送状态也更改 但是用户就是没收到邮件. 出现原因:发送邮件太多 导致邮箱服务器被腾讯封了 发送的邮件统统进入了邮件服务器的草稿箱里. 解决方案: 重新修改 ...
- Qt多线程实现思路一
实现一个线程开启时,时间计时器任然能够计数,两路独立工作的线程功能.从类的帮助文件中可以看到如下信息,静态公共成员函数和保护类型的函数,在静态函数中有睡眠函数msleep毫秒级,sleep秒级,usl ...
- Python论做游戏外挂,Python输过谁?
玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢? 我打开了4399小游戏网,点开了一个不知名的游戏,唔,做寿司的,有材料在一边,客人过来后说出他们的要求,你按照菜 ...
- springboot~集成DataSource 与 Druid监控配置
介绍 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部 ...
- pycharm+anaconda在Mac上的配置方法 2019.11.29
内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...
- python开发第二篇 :python基础
python基础a.Python基础 -基础1. 第一句python -python后缀名可以任意? -导入模块时如果不是.py文件,以后的文件后缀名是.py.2.两种 ...