深入学习c++--智能指针(三) unique_ptr
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离开作用域时释放该对象的智能指针在下列两者之一发生时用关联的删除器释放对象:
通过调用 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());
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的更多相关文章
- 智能指针(三):unique_ptr使用简介
我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如 ...
- [转] 智能指针(三):unique_ptr使用简介
PS: 1. auto_ptr太不安全,可能多个auto_ptr指向一个对象,出现重复释放的问题 2. unique_ptr解决了这个问题,不允许拷贝构造函数和赋值操作符,但是!它支持移动构造函数,通 ...
- 深入学习c++--智能指针(一) shared_ptr
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个 ...
- 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
- 【校招面试 之 C/C++】第27题 C++ 智能指针(三)之 unique_ptr
auto_ptr<string> p1(new string ("auto") : //#1 auto_ptr<string> p2; //#2 p2 = ...
- c++学习笔记——智能指针
智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...
- c++智能指针(unique_ptr 、shared_ptr、weak_ptr、auto_ptr)
一.前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针). c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写 ...
- 【STL学习】智能指针之shared_ptr
前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择 几乎所有的程序都需要某种形式的引用计数智能指 ...
- 智能指针之 unique_ptr
对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存, 我们需要时刻记得释放,且不能重复释放,释放后不能再去 ...
随机推荐
- rocketmq那些事儿之集群环境搭建
上一篇入门基础部分对rocketmq进行了一个基础知识的讲解说明,在正式使用前我们需要进行环境的搭建,今天就来说一说rockeketmq分布式集群环境的搭建 前言 之前已经介绍了rocketmq的入门 ...
- (三)WCF之契约
自从我们接收ITOO项目之后,就必须跟WCF打交道,既然必须直面WCF,我就对WCF进行了研究(还不是很深入,是自己目前的理解).之前对WCF的一些基础知识进行了简单的介绍,本篇重点来介绍WCF的契约 ...
- html页面标记 点击目录跳转到页面相应位置 简易回到顶部
html页面标记 点击目录跳转到页面相应位置 简易回到顶部 参考博客:
- JS判断移动端访问设备并加载对应CSS样式
JS判断不同web访问环境,主要针对移动设备,提供相对应的解析方案(判断设备代码直接copy腾讯网的) // 判断是否为移动端运行环境 if(/AppleWebKit.*Mobile/i.test(n ...
- SQL Server Default Trace查看是谁对数据库进行了DDL操作
在我们的工作中可能会遇到这样一种情形.由于数据库中某些对象被altered/created/deleted,造成我们的应用程序crash. 当我们把问题解决之后,老板可能会问发生了什么?为什么会这样? ...
- Kafka 通过python简单的生产消费实现
使用CentOS6.5.python3.6.kafkaScala 2.10 - kafka_2.10-0.8.2.2.tgz (asc, md5) 一.下载kafka 下载地址 https://ka ...
- MongoDB bindIp 与 bindIpAll
Linux服务器上安装MongoDB后,允许其它客户端IP访问MongoDB服务器.阿里云服务器需要设置入站规则,可参见使用外网访问阿里云服务器ZooKeeper 1.允许所有地址访问 NOTE:ne ...
- 洛谷P2751 工序安排Job Processing
题目 任务调度贪心. 需要明确一点,任务调度贪心题,并不是简单地应用排序的贪心,而是动态的运用堆,使每次选择是都能保持局部最优,并更新状态使得下次更新答案可以取到正确的最小值. 这是A过程的解. 然后 ...
- 查看CPU占用工具
recording_5492_1.jfr jcmd 5942 JFR.start delay=1s duration=200s name=serverRecording filename=./reco ...
- 利用Unicode RTLO方法构建恶意文件名
一:简介 RTLO"字符全名为"RIGHT-TO-LEFTOVERRIDE",是一个不可显示的控制类字符,其本质是unicode 字符."RTLO"字 ...