shared_ptr(智能指針)

只要將 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 託管,編譯時不會有問題,但程序運行時會出錯,因爲不能析構一個並沒有指向動態分配的內存空間的指針。

 

參考文獻:

  1. http://c.biancheng.net/view/430.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章