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

我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,可咋整呢?

这个时候就要使用unique_ptr了,顾名思义嘛,unique是唯一的意思.说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存.但它还有些其他特性.

1.无法进行复制构造与赋值操作.

比如auto_ptr<int> ap(new int(88 );

      auto_ptr<int> one (ap) ; // ok

      auto_ptr<int> two = one; //ok

但unique_ptr不支持上述操作

  unique_ptr<int> ap(new int(88 );

  unique_ptr<int> one (ap) ; // 会出错

  unique_ptr<int> two = one; //会出错

 

2.可以进行移动构造和移动赋值操作

就是像上面这样一般意义上的复制构造和赋值或出错.但在函数中作为返回值却可以用.

unique_ptr<int> GetVal( ){

unique_ptr<int> up(new int(88 );

return up;

}

 

unique_ptr<int> uPtr = GetVal();   //ok

 

实际上上面的的操作有点类似于如下操作

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也同样不能直接做为容器元素,但可以通过一点间接的手段

例如:

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对象失效.

时间: 2024-12-22 09:34:40

智能指针(三):unique_ptr使用简介的相关文章

C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)_C 语言

shared_ptr基本用法 shared_ptr采用引用计数的方式管理所指向的对象.当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1.当shared_ptr离开作用域时,引用计数减1.当引用计数为0时,释放所管理的内存. 这样做的好处在于解放了程序员手动释放内存的压力.之前,为了处理程序中的异常情况,往往需要将指针手动封装到类中,通过析构函数来释放动态分配的内存:现在这一过程就可以交给shared_ptr去做了. 一般我们使用make_shared来

c++11教程 智能指针讲解

如果在程序中使用new从堆(自由存储区)分配内存,等到不需要时, 应使用delete将其释放.c++引入了智能指针auto_ptr, 以帮助自动完成这个过程. c++11摒弃了auto_ptr,并新增了三种智能指针:unique_ptr, shared_ptr, weak_ptr. 一. auto_ptr, unique_ptr , shared_ptr 头文件:  #include <memory> 用法:auto_ptr<double>  A(new double);uniqu

大型项目开发:谨慎使用智能指针

智能指针使用上的问题 智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦.主要包括两个问题点: 性能问题.因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高.比如以智能指针作为函数参数以及返回值时. 对象释放的时机不明确.比如std::auto_ptr,总让人感觉不明不白.而有时一些循环引用,又会导致内存泄露. 所以即便有了智能指针,程序员还是要认真考虑使用它们的时机. 智能指针的本质是所

C++中智能指针(smarter pointer)自定义删除器(deleter) 的方法

智能指针包含两种"shared_ptr"和"unique_ptr", 由于两种指针的实现方式不同, 所以传递删除器的方式也不同; "shared_ptr"的传递删除器(deleter)方式比较简单, 只需要在参数中添加具体的删除器函数名, 即可; 注意是单参数函数; "unique_ptr"的删除器是函数模板(function template), 所以需要在模板类型传递删除器的类型(即函数指针(function pointe

引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

 1.引用内部函数绑定机制 #include<iostream> #include<functional>   usingnamespacestd; usingnamespacestd::placeholders;   //仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的共有函数 structMyStruct {    voidadd(inta)    {        cout <<a <<endl;    }    voidadd2(in

【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert

引用包装器  std::ref(变量) #include<iostream> template<class T> void com(T arg)//模板函数,引用无效,引用包装器 { std::cout <<"com ="<< &arg << "\n"; arg++; } void main() { int count = 10; int & rcount = count; com(coun

C++ 智能指针详解

来源:http://blog.csdn.net/xt_xiaotian/article/details/5714477 一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除.注意这个"其不需要的时候", 这可不是一个精确的定义.这个不需要的时候可以指好多方面:局部变量退出函数作用域.类的对象被析构--.所以boost定义了多个不同的智能指针来管理不同的场景. shared_ptr<T> 内部维护一个引用计数器来判断此指针是不是需要

C++智能指针实例详解_C 语言

本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解.详情如下: 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_p

C++面试题(四)——智能指针的原理和实现

C++面试题(一).(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了.      1,你知道智能指针吗?智能指针的原理.      2,常用的智能指针.      3,智能指针的实现. 1答案:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针.智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,      2, 最常用的智能指针:                1)std::auto_ptr,有很多问题. 不支持复制(拷贝