c++11之unique_ptr
2015-07-31 10:17
429 查看
下面的内容转自:智能指针
我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,可咋整呢?
这个时候就要使用unique_ptr了,顾名思义嘛,unique是唯一的意思.说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存.但它还有些其他特性.
1.无法进行复制构造与赋值操作.
比如auto_ptr ap(new int(88 );
但unique_ptr不支持上述操作
2.可以进行移动构造和移动赋值操作
就是像上面这样一般意义上的复制构造和赋值或出错.但在函数中作为返回值却可以用.
实际上上面的的操作有点类似于如下操作
3.可做为容器元素
我们知道auto_ptr不可做为容器元素.而unique_ptr也同样不能直接做为容器元素,但可以通过一点间接的手段
例如:
总结:
从上面的例子可以看出,unique_ptr和auto_ptr真的非常类似.其实你可以这样简单的理解,auto_ptr是可以说你随便赋值,但赋值完了之后原来的对象就不知不觉的报废.搞得你莫名其妙.而unique就干脆不让你可以随便去复制,赋值.如果实在想传个值就哪里,显式的说明内存转移std:move一下.然后这样传值完了之后,之前的对象也同样报废了.只不过整个move你让明显的知道这样操作后会导致之前的unique_ptr对象失效.
然后添加一些我自己的内容,unique_ptr还有两个方面的内容:
1.可以传递自己的deleter函数
表示这个智能指针指向类型为objT的对象,使用类型为delT的类为deleter,并且使用名为fcn的(类delT的具体对象)对象
表明end_connection是decltype(end_connection)类型的,这里要加上表示这是指向这种类型的指针
2.unique_ptr可以管理动态数组
他调用的是delete []函数
可以直接用 up[i]访问
我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,可咋整呢?
这个时候就要使用unique_ptr了,顾名思义嘛,unique是唯一的意思.说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存.但它还有些其他特性.
1.无法进行复制构造与赋值操作.
比如auto_ptr ap(new int(88 );
[code] auto_ptr<int> one (ap) ; // ok auto_ptr<int> two = one; //ok
但unique_ptr不支持上述操作
[code] unique_ptr<int> ap(new int(88 ); unique_ptr<int> one (ap) ; // 会出错 unique_ptr<int> two = one; //会出错
2.可以进行移动构造和移动赋值操作
就是像上面这样一般意义上的复制构造和赋值或出错.但在函数中作为返回值却可以用.
[code]unique_ptr<int> GetVal( ){ unique_ptr<int> up(new int(88 ); return up; } unique_ptr<int> uPtr = GetVal(); //ok
实际上上面的的操作有点类似于如下操作
[code]unique_ptr<int> up(new int(88 ); unique_ptr<int> uPtr2 = std:move( up) ; //这里是显式的所有权转移. 把up所指的内存转给uPtr2了,而up不再拥有该内存.另外注意如果你使用vs2008是没有std:move这函数的. //vs2010开始才有,是c++ 11标准出现的内容.
3.可做为容器元素
我们知道auto_ptr不可做为容器元素.而unique_ptr也同样不能直接做为容器元素,但可以通过一点间接的手段
例如:
[code]unique_ptr<int> sp(new int(88) ); vector<unique_ptr<int> > vec; vec.push_back(std::move(sp)); //vec.push_back( sp ); 这样不行,会报错的. //cout<<*sp<<endl;但这个也同样出错,说明sp添加到容器中之后,它自身报废了.
总结:
从上面的例子可以看出,unique_ptr和auto_ptr真的非常类似.其实你可以这样简单的理解,auto_ptr是可以说你随便赋值,但赋值完了之后原来的对象就不知不觉的报废.搞得你莫名其妙.而unique就干脆不让你可以随便去复制,赋值.如果实在想传个值就哪里,显式的说明内存转移std:move一下.然后这样传值完了之后,之前的对象也同样报废了.只不过整个move你让明显的知道这样操作后会导致之前的unique_ptr对象失效.
然后添加一些我自己的内容,unique_ptr还有两个方面的内容:
1.可以传递自己的deleter函数
[code]unique_ptr<objT,delT> p(new objT,fcn);
表示这个智能指针指向类型为objT的对象,使用类型为delT的类为deleter,并且使用名为fcn的(类delT的具体对象)对象
[code]unique_ptr<connection,decltype(end_connection)*> p(&c,end_connection);
表明end_connection是decltype(end_connection)类型的,这里要加上表示这是指向这种类型的指针
2.unique_ptr可以管理动态数组
[code]unique_ptr<intp[]> up(new int[10]);
他调用的是delete []函数
可以直接用 up[i]访问
相关文章推荐
- 【暑期基础】P HDU 2015 偶数求和
- 黑马程序员---iOS基础---C语言中的结构体等问题
- 一个好用且方便的FastCgi C++库 - FastCgi++
- c++异常处理机制示例及讲解
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
- C#、Java、C、C++初始化数组过程和比较
- C++常见函数(备忘录)
- C++的继承关于向上类型转换
- C语言编程规范试题(标准答案)
- C语言编程规范试题
- C/C++基本知识(三)
- 模拟实现C语言中的内存管理
- C/C++基本知识(二)
- C语言常见函数(备忘录)
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++如何生成自己的静态库(lib)文件
- C++ inline和#define宏的区别
- c/c++常用的几个关键字总结
- C语言中的内存管理
- 黑马程序员---iOS基础---C语言中的指针