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[] 分配)

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());
auto p = obj.get();
if (p) {
}
//better
if (obj) {
} //operator -> *
cout << p->id() << " " << obj->id() << " " << (*obj).id() << endl;
print(obj); p = obj.release(); // 自身不再管理该指针
delete p; // 之后,该指针可以按常规指针处理 obj.reset(); // 把以前管理的资源调用析构
obj.reset(new Object()); // 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()) ;
// 只能右值传入
ObjectPtr sharedObj(std::move(obj));
assert(obj == nullptr); // obj不再管理资源 } int main()
{ uniquePtr();
return ;
}

深入学习c++--智能指针(三) unique_ptr的更多相关文章

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

    我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如 ...

  2. [转] 智能指针(三):unique_ptr使用简介

    PS: 1. auto_ptr太不安全,可能多个auto_ptr指向一个对象,出现重复释放的问题 2. unique_ptr解决了这个问题,不允许拷贝构造函数和赋值操作符,但是!它支持移动构造函数,通 ...

  3. 深入学习c++--智能指针(一) shared_ptr

    1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个 ...

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

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

  5. 【校招面试 之 C/C++】第27题 C++ 智能指针(三)之 unique_ptr

    auto_ptr<string> p1(new string ("auto") : //#1 auto_ptr<string> p2; //#2 p2 = ...

  6. c++学习笔记——智能指针

    智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...

  7. c++智能指针(unique_ptr 、shared_ptr、weak_ptr、auto_ptr)

    一.前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针). c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写 ...

  8. 【STL学习】智能指针之shared_ptr

    前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指 ...

  9. 智能指针之 unique_ptr

    对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存, 我们需要时刻记得释放,且不能重复释放,释放后不能再去 ...

随机推荐

  1. 透析C/S和B/S结构

    C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Informix或 SQL Server.客户端 ...

  2. RMQ--树状数组,ST表,线段树

    RMQ Range Minimum/Maximum Query 区间最值问题 树状数组 https://www.cnblogs.com/xenny/p/9739600.html lowbit(x) x ...

  3. vs 在高分屏下开发 winform 配置

    一.窗体控件大小 第一种方法:使用网格避免整除误差 在选项中将Windows窗体设计器的LayoutMode(布局模式)改成SnapToGrid(对齐到网格),并将Default Grid Cell ...

  4. Linux 命令 ipcs/ipcrm

    ipcs 1. 命令格式 ipcs [resource-option] [output-format] ipcs [resource-option] -i id 2. 命令功能 提供IPC设备的信息 ...

  5. jsp实现大文件上传分片上传断点续传

    1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...

  6. 2019.11.29 Mysql的数据操作

    为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...

  7. 数码管动态显示——74HC04

    1.电路设计: p0实现段选,p2实现位选,74hc04是反相器,有反向和放大的双重作用. 2.程序设计: #include<reg52.h> code unsigned char sev ...

  8. JS学习之--比较两个Object数组是否相等

    一.问题 在js中是不能直接用“==”或者“===”来计算两个数组是否相等的,那么就需要对数组的值进行比较: 二.次解决方案 对于比较两个数组次要的方法有如下几种,为什么说是次要解决方案呢?因为它不能 ...

  9. Processing玩抠图

    突然兴起想玩一下抠图,试着用自带的Example\video来改,花了一个中午做了个小样: 分别是白色为底与黑色为底的效果,代码如下: import processing.video.*; int n ...

  10. JavaWeb之基础(1) —— 文件、目录结构和创建项目

    1. JavaWeb应用 JavaWeb应用从大类上分为静态和动态两种. 静态应用就是传统的HTML文件+素材资源构造的静态网页,不需要特殊的配置.JavaWeb也不是专门用来做静态网站的. 动态应用 ...