C++智能指针之unique_ptr

版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/84821908

C++智能指针之auto_ptr一文中得知:在使用auto_ptr时,可能会不经意的将多个auto_ptr指向同一块内存,造成auto_ptr销毁释放时多次释放同一块内存。为了解决该问题,本文引出了unique_ptr。

顾名思义,unique是唯一的意思。说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存,与auto_ptr不同,unique_ptr还有些其他特性:

  1. unique_ptr无法进行复制构造与赋值操作,会编译报错
auto_ptr<int> ap(new int(88 );
auto_ptr<int> one (ap) ; // ok
auto_ptr<int> two = one; //ok

unique_ptr<int> ap(new int(88 );
unique_ptr<int> one (ap) ; // 编译会出错
unique_ptr<int> two = one; // 编译会出错
  1. unique_ptr可以进行移动构造和移动赋值操作

代码解释:这里是显式的所有权转移,即:将up所指的内存转给uPtr2,而up不再拥有该内存。

unique_ptr<int> up(new int(88 );
unique_ptr<int> uPtr2 = std:move(up);  //移动构造
  1. unique_ptr可以作为返回值,用于从某个函数中返回动态申请内存的所有权
unique_ptr<int> GetVal( )
{
  unique_ptr<int> up(new int(88 );
  return up;
}
unique_ptr<int> uPtr = GetVal();   //ok

代码解释:返回unique_ptr类型的变量,本质上是移动拷贝,等价于上面讲解的2中的代码。

  1. unique_ptr可做为容器元素,但是必须通过移动语义实现
vector<unique_ptr<int> > vec; //定义unique_ptr类型的vector

unique_ptr<int> sp(new int(88) ); //定义unique_ptr类型的变量sp
vec.push_back(std::move(sp)); //使用移动语义,将sp插入到vec中

cout<<*sp<<endl; //error,因为sp添加到容器过程中,sp失效,sp自身报废了。

vec.push_back(sp); // error,不使用移动语义添加编译会失败

总结:
从上面的例子可以看出:unique_ptr和auto_ptr真的非常类似。其实你可以这样简单的理解,auto_ptr是可以说你随便赋值,但赋值完了之后原来的对象就不知不觉的报废,搞得你莫名其妙;而unique就干脆不让你可以随便去复制、赋值,如果实在想传个值,必须显式的说明内存转移std:move一下。然后这样传值完了之后,之前的对象也同样报废了,只不过整个move你让明显的知道这样操作后会导致之前的unique_ptr对象失效。

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/84821908