只要將 new 運算符返回的指針 p 交給一個 shared_ptr 對象“託管”,就不必擔心在哪裏寫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 動態分配的那個對象。
多個 shared_ptr 對象可以共同託管一個指針 p,當所有曾經託管 p 的 shared_ptr 對象都解除了對其的託管時,就會執行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;
}
程序的輸出結果如下:
2,2,2
2
3
2 destructed
end
5 destructed
4 destructed
3 destructed
只有指向動態分配的對象的指針才能交給 shared_ptr 對象託管。將指向普通局部變量、全局變量的指針交給 shared_ptr 託管,編譯時不會有問題,但程序運行時會出錯,因爲不能析構一個並沒有指向動態分配的內存空間的指針。
參考文獻: