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)进行初始化都是不安全的。

 

posted @ 2016-04-05 20:07  ChenZhongzhou  阅读(230)  评论(0编辑  收藏  举报