12.1 动态内存与智能指针

12.1.3 shared_ptr和new结合使用

        shared_ptr和内置指针可以相互转化!

        shared_ptr有一个接受一个内置指针参数的构造函数,因此能用一个内置指针来初始化shared_ptr;又由于该构造函数是explicit的,所以不支持隐式地用内置指针构造shared_ptr(即不支持内置指针到shared_ptr的隐式类型转换)。造成的结果是:

       一、用内置指针初始化shared_ptr只能采用直接初始化,而不能采用拷贝初始化,如“shared_ptr<int> p1(new int(42))”是对的,而“shared_ptr<int> p1 = new int(42)”是错的!

        二、不能用内置指针为shared_ptr对象赋值,包括函数传参和返回值!如果非要这样做,那么就显示地构造一个临时的shared_ptr对象,再进行赋值,如“p1 = shared_ptr<int>(new int(1024))”!或者更简单的,使用“p1.reset(new int(1024))”。

        要注意的是,一旦用内置指针初始化shared_ptr或为其赋值,其所指内存的管理权就移交到shared_ptr手里了,如果shared_ptr计数值归零,该段内存被销毁,原来的内置指针就变成空悬指针了。因此,如果用内置指针初始化shared_ptr或为其赋值,在后面的代码中就不要再解引用该内置指针了!

        反过来,使用“p.get()”可以从一个shared_ptr获得其保存的内置指针,目的是在某些不能使用shared_ptr的地方使用内置指针,但这样做要注意两点:

        一、不能delete获得的内置指针!因为现在这段内存是shared_ptr管理的,delete该内置指针后,所有指向这段内存的shared_ptr都变成空悬指针了。

        二、不能用获得的内置指针初始化另一个shared_ptr或为其赋值,这样两个独立计数的shared_ptr指向同一段内存,如果其中一个shared_ptr的计数归零,该段内存就会被销毁!   


12.1.5 unique_ptr


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值