博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++内存管理之unique_ptr
阅读量:4655 次
发布时间:2019-06-09

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

 

  一个unique_ptr"拥有“他所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。当unique_ptr被销毁时,它所指向的对象也被销毁。uniptr_ptr表达的是一种独占的思想。

 

初始化

#include 
#include
using namespace std;//常规操作int main(int argc, char *argv[]){ unique_ptr
p1; //!可指向一个double的unique_ptr unique_ptr
p2(new int(56)); //!p2指向了一个值为42的int unique_ptr
pstr(new string("strtest"));// unique_ptr
pstrCopy(pstr); //!error: 不支持对象的拷贝 unique_ptr
pstrAssin;// pstrAssin = pstr //!error: uniptr不支持赋值 return 0;}

 

unique_ptr一般操作

 

  关于unique_ptr还支持哪些操作,在前面的博文中我也做了总结,请参考该篇文章中图表:https://www.cnblogs.com/wangkeqin/p/9351191.html

 

 

 unique_ptr所有权转移

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

#include 
#include
using namespace std;class TEST{public: TEST(const string & name) :_name(name) {cout<<"TEST:"<<_name<
_name=another._name; cout<
<<" copyAssin to "<<_name<
p1(new TEST("case_1")); unique_ptr
p2(p1.release()); //!将所有权从p1转移到p2,p1现在指向NULL。 cout<<"++++++++++++++++++++++++"<
p3(new TEST("case_2")); p2.reset(p3.release()); //!p2释放了原来指向的内存,接受了p3指向的内存。 getchar();}

 

 

传递unique_ptr参数和返回unique_ptr

  不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或者赋值一个将要被销毁的unique_ptr。其本质就是调用了移动拷贝和移动赋值;最常见的例子是从函数返回一个unique_ptr:

#include 
#include
using namespace std;class TEST{public: TEST(const string & name) :_name(name) {cout<<"TEST:"<<_name<
_name=another._name; cout<
<<" copyAssin to "<<_name<
retDying(string param){ return unique_ptr
(new TEST(param));}//②返回一个局部对象;unique_ptr
retTemp(string param){ unique_ptr
pTemp(new TEST(param)); return pTemp;}int main(){ unique_ptr
ret1 = retDying("dying"); cout<<(*ret1)._name<
ret2 = retTemp("temp"); cout<<(*ret2)._name<

 

 

向后兼容:auto_ptr

  标准库较早的版本包含了一个名为auto_ptr的类,它具有unique_ptr的部分特性,但不是全部。特别时我们在容器中保存auto_ptr,也不能从函数中返回auto_ptr。虽然auto_ptr仍然是标准库的一部分,但是编写程序时应该使用unique_ptr。

 

向unique_ptr传递删除器

  类似于shared_ptr,unique_ptr默认情况下也是使用delete释放它指向的对象。与shared_ptr一样,我们可以重载一个unique_ptr中默认的删除器。但是unique_ptr管理删除器的方式与shared_ptr不同,其原因我们将在后面继续补充。

  重载一个unique_ptr中的删除器会影响到unique_ptr类型如何构造(或reset)该类型的对象。与重载关联器的比较操作类似。我们必须在尖括号中unique_ptr指向类型之后提供删除器类型。在创建或者reset一个这种unique_ptr这种类型的对象时,必须提供一个指定类型的可调用对象:

 

#include 
#include
using namespace std;void closePf(FILE * pf){ cout<<"----close pf after works!----"<
pf(fopen("bin2.txt", "w"),closePf); // cout<<"*****start working****"<
pf(fopen("bin2.txt", "w"),closePf); //!使用了decltype类型推断 cout<<"*****start working****"<

 

使用unique_ptr管理动态数组

  标准库提供了一个可以管理new分配动态数组的unique_ptr版本。为了用用一个unique_ptr管理动态数组,我们必须在对象类型后面跟一对空方括号;如此,在unique对象销毁的时候,也可以自动调用delete[ ]而非delete来完成内存的释放。

#include 
#include
using namespace std;class ArrTest{public: ArrTest(){ static int i = 0; _i = i; cout<<" ArrTest()"<<":"<
<
p(new ArrTest[10]); cout<
<

 

 

转载于:https://www.cnblogs.com/wangkeqin/p/9383658.html

你可能感兴趣的文章
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>
JavaScript中的原型继承原理
查看>>
Python logger模块
查看>>
jquery控制css的display(控制元素的显示与隐藏)
查看>>
关于python做人工智能的一个网页(很牛逼)
查看>>
判断控件的CGRect是否重合,获取控件的最大XY值
查看>>
POJ-1128 Frame Stacking
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
P4878 道路修建-美国
查看>>
dp练习
查看>>