在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

std::unique_ptr release的使用的更多相关文章

  1. 智能指针std::unique_ptr

    std::unique_ptr 1.特性 1) 任意时刻只能由一个unique_ptr指向某个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调用析构函数实现删除对象) 2)禁止拷贝和赋值 ...

  2. C++11智能指针之std::unique_ptr

    C++11智能指针之std::unique_ptr   uniqut_ptr是一种对资源具有排他性拥有权的智能指针,即一个对象资源只能同时被一个unique_ptr指向. 一.初始化方式 通过new云 ...

  3. (译+原)std::shared_ptr及std::unique_ptr使用数组

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...

  4. 字符串连接比较(std::unique_ptr实现)

    比较代码之间可能相差大,可是速度相差很大,而且目的在于测试unique_ptr使用...; C/C++: #include <iostream> std::unique_ptr<ch ...

  5. std::unique_ptr的用法

    std::ofstream("demo.txt") << 'x'; // 准备要读的文件 { std::unique_ptr<std::FILE, decltyp ...

  6. 智能指针(1)-std::unique_ptr

    std::unique_ptr std::unique_ptr是一种几乎和原始指针一样高效的智能指针,对所管理的指针资源拥有独占权.由C++11标准引入,用于替代C++98中过时的std::auto_ ...

  7. std::unique_ptr使用incomplete type的报错分析和解决

    Pimpl(Pointer to implementation)很多同学都不陌生,但是从原始指针升级到C++11的独占指针std::unique_ptr时,会遇到一个incomplete type的报 ...

  8. 智能指针思想实践(std::unique_ptr, std::shared_ptr)

    1 smart pointer 思想 ​ 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ​ ...

  9. 关于std:auto_ptr std:shared_ptr std:unique_ptr

    很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确 ...

  10. C++11 unique_ptr智能指针详解

    在<C++11 shared_ptr智能指针>的基础上,本节继续讲解 C++11 标准提供的另一种智能指针,即 unique_ptr 智能指针. 作为智能指针的一种,unique_ptr ...

随机推荐

  1. RabbitMQ管理界面使用之手动送数据

    目录 1. 找到相应的队列, 点击进入详情 2. 找到Publish Message项,填写自定义数据 3. 发送数据 4. 发送成功 5. 接收 1. 找到相应的队列, 点击进入详情 2. 找到Pu ...

  2. 掌控安全学院SQL注入靶场宽字节注入

    在php中,magic_quotes_gpc这个函数为on时,就开启了转义功能,另外addslashes和mysql_real_escape_string也可以实现转义功能.可转移的的内容包括:单双引 ...

  3. MQTT 客户端出现连接订阅等问题时如何排查?

    大家好,这是一期社区专题 FAQ.我们整理了近期社区中关注度较高的问题,在这里进行统一汇总解答. 今后本系列内容将不定期推送,敬请关注. 同时,如果大家在使用 EMQX 的过程中遇到问题,欢迎通过以下 ...

  4. 《Rust权威指南》学习笔记——8.通用集合类型

    Rust通用集合类型 动态数组Vec 字符串String 和&str 哈希映射HashMap

  5. expect语言使用之自动切换账户或自动登录远程服务器

    资料来源: (1) https://baike.baidu.com/item/expect/4598715?fr=aladdin (2) https://blog.csdn.net/gsjthxy/a ...

  6. mac Big Sur 打开应用提示,您没有权限来打开应用程序

    终端输入codesign --force --deep --sign - /Applications/{AppName.app}注意{AppName.app} 替换为无法打开的应用程序名,将尝试强制签 ...

  7. drupal clean url 配置

    使用 find / -name "apachectl"查找文件目录下执行 ./apachectl -v 转载于:https://www.cnblogs.com/thinkingth ...

  8. PyTables 教程(一)入门,浏览对象树,将数据提交到表和数组

    翻译自http://www.pytables.org/usersguide/tutorials.html 教程 Seràs la clau que obre tots els panys, seràs ...

  9. Intel oneAPI 环境变量设置

    因工作需要,需要在linux系统配置多个不同环境的库,需要使用environment-modules工具管理环境变量,为保持配置方法的一致性,也使用modulefile文件加载Intel oneAPI ...

  10. .Net Core 中使用NLog替代默认日志

    1.添加引用nlog.config和Nlog.Web.AspNetCore 2.配置NLog 配置文件 添加一个Web配置文件xxxx.Config <?xml version="1. ...