unique_ptr、shared_ptr智能指针与STL容器的陷阱

unique_ptr智能指针

  • 与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,而且由于unique_ptr不可以进行拷贝和赋值操作,初始化unique_ptr必须使用直接初始化的方式
unique_ptr<int> a(new int());  //成功,直接初始化
unique_ptr<int> b=new int();   //失败! 构造函数是explicit
unique_ptr<int> c(a);          //失败! 不允许拷贝

可以进行移动构造和移动赋值操作,在函数中做为返回值使用 

unique_ptr<int> print( ){
unique_ptr<int> a(new int(10));
return a;//局部变量
}

unique_ptr<int> b=print();   //运行成功

或者

unique_ptr<int> print( ){
return unique_ptr<int> (new int(10));//返回自身
}

unique_ptr<int> b=print();   //运行成功

 

上面的操作有些类似move的做法, 

unique_ptr<int> a(new int(10));

unique_ptr<int> b=std:move(a) ; //这里是显式的所有权转移,把a所指的内存转给b了,而a不再拥有该内存

unique_ptr做为STL容器的元素时,不能直接进行传递,因为不可以进行拷贝和赋值操作.

vector<unique_ptr<int>> a;
a.push_back(new int(20));    //错误
a.emplace_back(new int(20)); //错误
a.emplace_back(make_unique<int>(20)); //错误

但可以通过move函数转换权限从而实现 ,

unique_ptr<int> a(new int(20));

vector<unique_ptr<int>> b;
b.push_back(std::move(a));    //正确

有一点值得注意的是:

 unique_ptr做为STL容器的元素时,不能作为类的成员变量,

class a{
//省略
}

class b{
private:
   vector<unique_ptr<int>> temp; //错误
   vector<unique_ptr<a>> tmp;    //错误
}

share_ptr智能指针 

可以实现拷贝和赋值,所以上面出现的错误都能运行。

vector<shared_ptr<int>> a;
a.push_back(new int(20));    //成功
a.emplace_back(new int(20)); //成功
a.emplace_back(make_unique<int>(20)); //成功
class a{
//省略
}

class b{
private:
   vector<shared_ptr<int>> temp; //成功
   vector<shared_ptr<a>> tmp;    //成功
}

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值