zoukankan      html  css  js  c++  java
  • 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)进行初始化都是不安全的。

  • 相关阅读:
    Uva673 Parentheses Balance
    cordforce Educational Codeforces Round 47 补题笔记 <未完>
    cordforce 495 补题 <未完>
    linux 基本命令笔记
    app审核相关
    CATransform3D
    UITableView点击切换状态分析
    iOS大转盘抽奖
    被忽视的控件UIToolbar
    AVPlayerViewController视频播放器
  • 原文地址:https://www.cnblogs.com/ChenZhongzhou/p/5356231.html
Copyright © 2011-2022 走看看