在c++中,动态内存管理是通过new/delete 运算符来进行的。由于确保在正确的时间释放内存是很困难的,为了避免内存泄漏,更加容易,安全地使用动态内存,C++11标准库提供了两种智能指针类型来管理动态对象。只能指针的行为类似于常规指针,重要的区别是它负责自动释放所指的对象。

std::shared_ptr ,  允许多个指针指向同一个对象

std::unique_ptr, 独占所指向的对象

std::unique_ptr 是 c++11中用来取代 std::auto_ptr 指针的指针容器。 它不能与其他unique_ptr类型的指针对象共享所指对象的内存。这种所有权仅能够通过std::move函数来转移。unique_ptr是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。

调用release 会切断unique_ptr 和它原来管理的对象的联系。release 返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。如果不用另一个智能指针来保存release返回的指针,程序就要负责资源的释放。

#include <iostream>
#include <memory> int main() { std::unique_ptr<int> uptr(new int(10)); //绑定动态对象
//std::unique_ptr<int> uptr2 = uptr; //不能賦值
//std::unique_ptr<int> uptr2(uptr); //不能拷内
std::unique_ptr<int> uptr2 = std::move(uptr); //轉換所有權 if(uptr == nullptr)
printf("uptr give up *int\n"); int * p = uptr2.release(); //uptr2释放对指针的控制权,返回指针,并将uptr2置为空 if(uptr2 == nullptr)
printf("uptr2 give up *int\n"); printf("%d\n", *p);
delete p; return 0;
}

输出结果:

[daq@centos build]$ ./hello-exe/cmake-good
uptr give up *int
uptr2 give up *int
10

最新文章

  1. tg2015 信息传递 (洛谷p2661)
  2. 开发错误记录9:Application无法跳转到Activity
  3. TJOI2016 &amp;&amp; HEOI2016 解题报告
  4. 李洪强iOS开发支付集成之支付宝支付
  5. 【原创】Linux 增加系统调用
  6. 记“debug alipay”一事
  7. MySQL中关于日期、时间的数据类型和函数
  8. Location-aware Associated Data Placement for Geo-distributed Data-intensive Applications--INFOCOM 2015
  9. Repeated Substring Pattern Leetcode
  10. 微信小程序之给项目设置id后提示不在合法域名列别中
  11. h5 canvas 图片上传操作
  12. HDU 1754 I Hate It(线段树之单点更新,区间最值)
  13. python_如何使用临时文件
  14. Android Studio打包过程和应用安装过程
  15. Android学习之基础知识九—数据存储(持久化技术)
  16. python使用cx_Oracle在Linux和Windows下的一点差异
  17. wpf学习
  18. Hdu2819 Swap
  19. ubuntu14.04_install_gitlab_platform
  20. Openresty最佳案例 | 第4篇:OpenResty常见的api

热门文章

  1. vue整体回顾
  2. WIN10操作系统如何利用无线网卡连接wifi再通过有线网卡共享网络给路由(双网卡)
  3. RocketMQ学习笔记
  4. (1019) rapidsvn 安装
  5. axios响应拦截器无法显示响应头问题
  6. 【Java学习Day02】基本的Dos命令
  7. EBS关于LPN的API【OM】
  8. expect语言使用之自动切换账户或自动登录远程服务器
  9. &#39;xxx&#39; must be unique because it is referenced by a foreign key.
  10. js 评论时间换算