博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++Primer : 第十二章 : 智能指针unique_ptr类
阅读量:2434 次
发布时间:2019-05-10

本文共 1911 字,大约阅读时间需要 6 分钟。

unique_ptr类:某个时刻只能有一个unique_ptr指向一个给定对象,当unique_ptr被销毁时,它所指向的对象也被销毁。

与shared_ptr不同,没有类似make_shared的标准库函数返回一个unique_ptr。当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针上。类似shared_ptr,初始化unique_ptr必须采用直接初始化形式:

unique_ptr
p1; //可以指向一个double的unique_ptrunique_ptr
p2(new int(42)); //p2指向一个值为42的int

由于一个unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作:

unique_ptr
p1(new string("SARS"));unique_ptr
p2(p1); //错误:unique_ptr不支持拷贝unique_ptr
p3;p3 = p2; //错误:unique_ptr不支持赋值

unique_ptr操作

unique_ptr
u1 //空unique_ptr,可以指向类型为T的对象,u1会使用delete来释放它的指针unique_ptr
u2 //u2会使用一个类型为D的可调用对象来释放它的指针unique_ptr
u(d) //用类型为D的对象d代替deleteu = nullptr //释放u指向的对象,将u置为空u.release() //u放弃对指针的控制权,返回指针,并将u置为空u.reset() //释放u指向的对象u.reset(q) //如果提供了内置指针q,令u指向这个对象,否则将u置空

虽然不能拷贝或赋值unique_ptr,但可以通过调用release或reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique_ptr:

unique_ptr
p2(p1.release()); //p1被置空,所有权从p1转移给p2unique_ptr
p3(new string("Trex"));//将所有权从p3转移给了p2p2.reset(p3.release()); //reset释放了p2原来指向的内存

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

p2.release();    //错误:p2不会释放内存,而且我们丢失了指针auto p = p2.release();   //正确:但必须记得delete(p)

传递unique_ptr参数和返回unique_ptr

不能拷贝unique_ptr的规则有一个例外;我们可以拷贝或赋值一个将要被销毁的unique_ptr。最常见的例子是从函数返回一个unique_ptr:

unique_ptr
clone(int p){
//正确:从int*创建一个unique_ptr
return unique_ptr
(new int(p));}

还可以返回一个局部对象的拷贝

unique_ptr
clone(int p){
unique_ptr
ret(new int(p)); return ret;}

向unique_ptr传递删除器

我们必须在尖括号中unique_ptr指向类型之后提供删除器类型。在创建或reset一个这种unique_ptr类型的对象时,必须提供一个指定类型的可调用对象(删除器):

//p指向一个类型为objT的对象,并使用一个类型为delT的对象释放objT对象//它会调用一个名为fcn的delT类型对象unique_ptr
p(new objT, fcn);

转载地址:http://ntxmb.baihongyu.com/

你可能感兴趣的文章
What is the difference between gross sales and revenue?
查看>>
Dreamweaver默认打开后缀名为ftl的文件时
查看>>
LNMP一键安装
查看>>
几个分析函数的比较
查看>>
主流算法:
查看>>
RMI
查看>>
J.U.C之Future
查看>>
缓存思想分析
查看>>
一致性hash
查看>>
J.U.C之ConcurrentHashMap分析
查看>>
J.U.C之CopyOnWriteArrayList
查看>>
J.U.C之Atomic&CAS
查看>>
常用js
查看>>
类的生命周期
查看>>
Joda-Time学习
查看>>
Guava扩展工具包
查看>>
Jedis分片策略-一致性Hash
查看>>
BeanFactory和FactoryBean
查看>>
用户态和内核态的概念区别
查看>>
情境领导力
查看>>