我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,可咋整呢?

这个时候就要使用unique_ptr了,顾名思义嘛,unique是唯一的意思.说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存.但它还有些其他特性.

1.无法进行复制构造与赋值操作.

比如auto_ptr<int> ap(new int(88 );

auto_ptr<int> one (ap) ; // ok

auto_ptr<int> two = one; //ok

但unique_ptr不支持上述操作

unique_ptr<int> ap(new int(88 );

unique_ptr<int> one (ap) ; // 会出错

unique_ptr<int> two = one; //会出错

2.可以进行移动构造和移动赋值操作

就是像上面这样一般意义上的复制构造和赋值或出错.但在函数中作为返回值却可以用.

unique_ptr<int> GetVal( ){

unique_ptr<int> up(new int(88 );

return up;

}

unique_ptr<int> uPtr = GetVal();   //ok

实际上上面的的操作有点类似于如下操作

unique_ptr<int> up(new int(88 );

unique_ptr<int> uPtr2 = std:move( up) ; //这里是显式的所有权转移. 把up所指的内存转给uPtr2了,而up不再拥有该内存.另外注意如果你使用vs2008是没有std:move这函数的.

//vs2010开始才有,是c++ 11标准出现的内容.

3.可做为容器元素

我们知道auto_ptr不可做为容器元素.而unique_ptr也同样不能直接做为容器元素,但可以通过一点间接的手段

例如:

unique_ptr<int> sp(new int(88) );

vector<unique_ptr<int> > vec;

vec.push_back(std::move(sp));

//vec.push_back( sp ); 这样不行,会报错的.

//cout<<*sp<<endl;但这个也同样出错,说明sp添加到容器中之后,它自身报废了.

总结:

从上面的例子可以看出,unique_ptr和auto_ptr真的非常类似.其实你可以这样简单的理解,auto_ptr是可以说你随便赋值,但赋值完了之后原来的对象就不知不觉的报废.搞得你莫名其妙.而unique就干脆不让你可以随便去复制,赋值.如果实在想传个值就哪里,显式的说明内存转移std:move一下.然后这样传值完了之后,之前的对象也同样报废了.只不过整个move你让明显的知道这样操作后会导致之前的unique_ptr对象失效.

unique_ptr使用简介相关推荐

  1. 智能指针(三):unique_ptr使用简介

    文章转自:http://blog.csdn.net/weiwenhp/article/details/8708281 版权归原作者! 我们知道auto_ptr通过复制构造或者通过=赋值后,原来的aut ...

  2. 【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )

    文章目录 I . 智能指针 引入 II . 智能指针 简介 III . 智能指针 简单示例 I . 智能指针 引入 1 . 示例前提 : 定义一个 Student 类 , 之后将该类对象作为智能指针指 ...

  3. RALL原则和unique_ptr

    文章目录 一.RALL简介 二.RALL机制 三.智能指针的介绍 四.std::unique_ptr的使用 一.RALL简介 RALL是resource acquisition is initiali ...

  4. 区块链技术之数字签名简介

    区块链技术之数字签名简介 区块链比特币中利用数字签名来保证数据在整个系统中不可篡改,并保证交易双方的身份真实可靠.数字签名使用了非对称加密技术和数字摘要技术,保证了数据在传输过程中的完整性.发送者身份 ...

  5. 智能指针 unique_ptr 详解

    一.智能指针 1.什么是智能指针 简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时.妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值. 2.常规指针 ...

  6. 有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...

    有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代 太阳火神的美丽人生 (http://blog.csdn.n ...

  7. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  8. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  9. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

最新文章

  1. 匿名函数应用-多线程测试代码
  2. 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
  3. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( End of statement expected )
  4. React Ways1——函数即组件
  5. spark RDD iterator中sparkEnv功能 -- (视频笔记)
  6. 有效的Java第三版有哪些新功能?
  7. 高级Python:定义类时要应用的9种最佳做法
  8. netty接收大文件的方法
  9. 联想拯救者y7000加内存条_关于2020款联想拯救者Y7000、R7000和Y7000P,r7000p选哪个好?看这里就对了...
  10. Never Wait for Weights(带权并查集+路径压缩)
  11. Django rest framework 序列化组件
  12. 利用雪碧图及css自制的动态变色导航栏
  13. 计算机毕业设计(80)php小程序毕设作品之视频播放电影小程序系统
  14. 固态服务器维护,固态硬盘保养和维护
  15. Jupyter 福音: 官方可视化 Debug 工具!
  16. 别光盯着未来!看看海尔智家此前都布局了什么?
  17. 2020研究生数学建模B题——汽油辛烷值优化——获奖论文思路分享
  18. 【20考研数学】整体难度如何,有什么特点?
  19. 概率(probability)---似然(likelihood)的前世今生
  20. HTML CSS 动画 实现图片过渡与变换(图片不超过边框范围局部放大)

热门文章

  1. Apache Nifi 实战:多表导入实现及填坑 GitChat连接
  2. lambda写法(多参数)
  3. Flex中的Base64加解密
  4. 4字节 经纬度_java 获取本机经纬度
  5. delphi 第一个字符不能是小数点_元字符的详细解析
  6. leetcode 121
  7. 【C语言进阶深度学习记录】八 C语言中void的分析
  8. CSDN-Markdown-图片设置(大小,居中)
  9. 九度oj题目1518:反转链表
  10. Javascript设置对象属性为只读