今天继续学习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)进行初始化都是不安全的。