12.1 动态内存与智能指针(2)

今天继续学习12.1节时,从练习12.17中发现了一个问题。

首先摘录教材中的原话——一个unique_ptr“拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。

也就是说,不可能同时存在两个unique_ptr指针指向同一个对象的情况。

先给出练习12.17中的练习代码,然后观察现象:

int main(void)
{
  //练习12.17 
  int ix = 1024, *pi = &ix, *pi2 = new int(2048); //pi和pi2为内置指针
  typedef unique_ptr<int> IntP;  
  IntP p2(pi2); //正确的,用内置指针初始化一个unique_ptr
  IntP p5(p2.get()); //正确的,用p2返回的内置指针初始化创建一个unique_ptr

  cout << *p5 << " ";
  cout << *p2 << endl;
  
  *pi2 = 42;

  cout << *p5 << " ";
  cout << *p2 << endl;

  p5.reset(); //释放p5所指向的对象
  cout << *p2 << endl; //产生未定义的结果

return 0; }

运行得到的结果为:

 

可以看出unique_ptr指针p2和p5指向了同一个对象!而这个本质原因是利用了内置指针对这两个unique_ptr指针进行了初始化。在网上查找了一些资料发现没有解答,目前我初步的猜想是unique_ptr并没有shared_ptr那样的计数机制,当用同一个内置指针给unique_ptr初始化时,它并不能知道是否有其他unique_ptr指针指向这个对象,所以导致出现了多个unique_ptr指针指向同一个对象!所以利用内置指针对智能指针(无论是shared_ptr还是unique_ptr)进行初始化都是不安全的。

 

转载于:https://www.cnblogs.com/ChenZhongzhou/p/5356231.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值