1. 几种智能指针

1. auto_ptr: c++11中推荐不使用他(放弃)

2. shared_ptr: 拥有共享对象所有权语义的智能指针

3. unique_ptr: 拥有独有对象所有权语义的智能指针

4. weaked_ptr: 到 std::shared_ptr 所管理对象的弱引用

1.1 unique_ptr

参考:https://zh.cppreference.com/w/cpp/memory/unique_ptr

  • std::unique_ptr 是通过指针占有并管理另一对象,并在 unique_ptr 离开作用域时释放该对象的智能指针

  • 在下列两者之一发生时用关联的删除器释放对象:

    • 销毁了管理的 unique_ptr 对象

    • 通过 operator= 或 reset() 赋值另一指针给管理的 unique_ptr 对象。

  • 通过调用 get_deleter()(ptr) ,用潜在为用户提供的删除器释放对象。默认删除器用 delete 运算符,它销毁对象并解分配内存。

  • unique_ptr 亦可以不占有对象,该情况下称它为空 (empty)

  • std::unique_ptr 有两个版本:

    • 管理个对象(例如以 new 分配)

    • 管理动态分配的对象数组(例如以 new[] 分配)

  • 类满足可移动构造 (MoveConstructible) 和可移动赋值 (MoveAssignable) 的要求,但不满足可复制构造 (CopyConstructible) 或可复制赋值 (CopyAssignable) 的要求。

1.2 注意

  • 只有非 const 的 unique_ptr 能转移被管理对象的所有权给另一 unique_ptr 。若对象的生存期为 const std::unique_ptr所管理,则它被限定在创建指针的作用域中。

  • std::unique_ptr 常用于管理对象的生存期,包含:

    • 通过正常退出经由异常退出两者上的 受保证删除,提供异常安全,给处理拥有动态生存期的对象的类和函数

    • 传递独占的拥有动态生存期的对象的所有权到函数

    • 从函数获得独占的拥有动态生存期对象的所有权

1.3 使用方式

  • unique_ptr: 在某一个特定时刻,只有一个unique_ptr管理资源
  • 拷贝构造函数和 "=" 对于unique_ptr不存在
  • // UniqueObjectPtr(const UniqueObjectPtr&) = delete
    // UniqueObjectPtr(UniqueObjectPtr&&) = default
    // 把 资源转移给别人

#include <iostream>
#include <cassert>
#include <memory>
using namespace std;class Object
{
public:Object(int id) : m_id(id) {std::cout << "init obj " << m_id << std::endl;}    ~Object() {std::cout << "bye bye " << m_id << std::endl;}int id() const {return m_id;}
private:int m_id;
};typedef unique_ptr<Object> UniqueObjectPtr;
typedef std::shared_ptr<Object> ObjectPtr;void print(const UniqueObjectPtr& obj)
{}void Transfer(UniqueObjectPtr obj)
{cout << obj->id() << endl;
}// unique_ptr: 在某一个特定时刻,只有一个unique_ptr管理资源
// 拷贝构造函数和 "=" 对于unique_ptr不存在
void uniquePtr()
{UniqueObjectPtr obj(new Object(1));auto p = obj.get();if (p) {}//betterif (obj) {}//operator -> *cout << p->id() << " " << obj->id() << " " << (*obj).id() << endl;print(obj);p = obj.release();        // 自身不再管理该指针 delete p;                 // 之后,该指针可以按常规指针处理
    obj.reset();              // 把以前管理的资源调用析构 obj.reset(new Object(2)); // 1. obj.reset(); 2. 管理新的指针// UniqueObjectPtr(const UniqueObjectPtr&) = delete// UniqueObjectPtr(UniqueObjectPtr&&) = default // 把 资源转移给别人  Transfer(std::move(obj));  // 一个unique_ptr的值, 接收右值的引用 // 违反unique_ptr规则,上一行用函数形参传入unique_ptr,对于原有obj 已经不在管理他的资源,obj掌握一个空指针assert(obj == nullptr);
//    cout << obj->id() << endl;  // 某种情况下, 可能有其他类型也需要使用该 资源 // 转移成其他 智能指针 obj.reset(new Object(4)) ;// 只能右值传入
    ObjectPtr sharedObj(std::move(obj));assert(obj == nullptr);                    // obj不再管理资源 

}int main()
{uniquePtr();return 0;
}

转载于:https://www.cnblogs.com/douzujun/p/10803484.html

深入学习c++--智能指针(三) unique_ptr相关推荐

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

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

  2. C++11新特性——智能指针之unique_ptr

    此课件及源代码来自B站up主:码农论坛,该文章仅作为本人学习笔记使用. unique_ptr独享它指向的对象,也就是说,同时只有一个unique_ptr指向同一个对象,当这个unique_ptr被销毁 ...

  3. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr

    C++11智能指针(unique_ptr.shared_ptr.weak_ptr)_-码农小非-的专栏-CSDN博客_c++ shared_ptr weak_ptr 原创)智能指针拾遗 (原创)智能指 ...

  4. 智能指针之unique_ptr

    unique_ptr实现的是专属所有权语义,用于独占它所指向的资源对象的场合.某个时刻只能有一个unique_ptr指向一个动态分配的资源对象,也就是这个资源不会被多个unique_ptr对象同时占有 ...

  5. C++自学24:唯一智能指针(make_unique/unique_ptr/reset/release/get/13.1)

    使用make_unique获取一个智能指针,智能指针的类型是unique_ptr // a不是数组,小括号里的就是值 std::unique_ptr<int> a = std::make_ ...

  6. 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)

    1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...

  7. 32. 对c++中的smart pointer四个智能指针shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

    C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用. 智能指针的作用是管理一个指针, ...

  8. C++学习笔记——智能指针

    c++里不像java等语言设置了垃圾回收的功能,但是c++通过它的王牌指针实现了智能指针这一解决办法. 目录 异常 1.异常 2.异常的使用 3.异常的规则 4.异常安全 智能指针 概念 原理 aut ...

  9. C++ -- 智能指针 auto_ptr,unique_ptr,shared_ptr的简单实现和原理

    一,为什么需要智能指针 智能指针是一种预防型的内存泄漏的解决方案.由于C++没有垃圾回收器机制,所以每次new出来的资源都需要手动的delete,如果没有手动释放,就会造成资源泄漏等问题.因此,为了避 ...

最新文章

  1. mysql锁表_MYSQL锁表问题的解决方法
  2. Jquery绑定事件(bind和live的区别)[转]
  3. CSS图片廊实例详解
  4. C#语言-07.文件操作
  5. java监听某端口和ip_Java 通过Socket监听指定服务器(IP)的指定端口,及向指定服务器的指定端口发送信息...
  6. 数据科学竞赛-计算机视觉赛流程
  7. android jar 反射,android 第三方jar库 反射得到自己的资源ID
  8. 【推荐】BREW中 - 显示和图像
  9. Vue路由开启keep-alive缓存页面
  10. 程序员如何技术划水,手把手教你写Android项目文档,绝对干货
  11. nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用
  12. html模板安装到织梦,织梦网站安装教程 织梦模板通用安装图文教程
  13. Vue.js - Day2
  14. bugly android8.1加固,2020-09-27 Bugly Android热更新使用指南
  15. 为GridView-Delete列添加确认对话框(2种方法)
  16. TreeSet(不可重复,自动排序)实现自定义排序
  17. Android Studio(五):修改Android Studio项目包名
  18. Linux下进程通信方式(简要概述)
  19. linux 文件夹 775,Linux chmod目录权限命令图文详解
  20. 2021年高处作业安装拆除维护证考试题库解析

热门文章

  1. 低代码这么火,它的人才认证你考了吗?
  2. 如何利用云原生技术构建现代化应用?
  3. 技术解密|阿里云多媒体 AI 团队是凭借什么拿下 CVPR2021 5冠1亚的?
  4. 云效DevOps实践-代码评审
  5. 如何理解这6种常见设计模式?
  6. 从0到1,从概念到国际标准,蚂蚁共享智能凭什么?
  7. 动效如何构成连接 篇肆
  8. 手游行业洞察:Project Makeover成爆款,中国手游出海如何破局
  9. GoldenGate故障处理-表空间不足
  10. 将表导入到其他用户的impdp命令