delete p
語句——實際上根本不需要編寫這條語句,託管 p 的 shared_ptr 物件在消亡時會自動執行delete p
。而且,該 shared_ptr 物件能像指標 p —樣使用,即假設托管 p 的 shared_ptr 物件叫作 ptr,那麼 *ptr 就是 p 指向的物件。shared_ptr<T> ptr(new T); // T 可以是 int、char、類等各種型別
此後,ptr 就可以像 T* 型別的指標一樣使用,即 *ptr 就是用 new 動態分配的那個物件。delete p
。#include <iostream> #include <memory> using namespace std; class A { public: int i; A(int n):i(n) { }; ~A() { cout << i << " " << "destructed" << endl; } }; int main() { shared_ptr<A> sp1(new A(2)); //A(2)由sp1託管, shared_ptr<A> sp2(sp1); //A(2)同時交由sp2託管 shared_ptr<A> sp3; sp3 = sp2; //A(2)同時交由sp3託管 cout << sp1->i << "," << sp2->i <<"," << sp3->i << endl; A * p = sp3.get(); // get返回託管的指標,p 指向 A(2) cout << p->i << endl; //輸出 2 sp1.reset(new A(3)); // reset導致託管新的指標, 此時sp1託管A(3) sp2.reset(new A(4)); // sp2託管A(4) cout << sp1->i << endl; //輸出 3 sp3.reset(new A(5)); // sp3託管A(5),A(2)無人託管,被delete cout << "end" << endl; return 0; }程式的輸出結果如下:
A* p = new A(10); shared_ptr <A> sp1(p), sp2(p);sp1 和 sp2 並不會共用同一個對 p 的託管計數,而是各自將對 p 的託管計數都記為 1(sp2 無法知道 p 已經被 sp1 託管過)。這樣,當 sp1 消亡時要解構 p,sp2 消亡時要再次解構 p,這會導致程式崩潰。