1. 程式人生 > >C++各種智慧指標的用法及區別

C++各種智慧指標的用法及區別

    在C++程式設計中,智慧指標絕對是很強大的用法,boost庫裡把這些指標用的出神入化,它可以簡化程式設計師寫程式碼的複雜度,不用去考慮程式碼分支路徑導致的遺漏delete語法,也無須擔心冗餘delete導致的double free問題。但是,便利性也要求程式猿熟悉各種指標的用法,避免誤用,反而帶來其他問題。下面簡要列下常用的智慧指標,及其用法:

1.scoped_ptr:這是最常用的智慧指標,當你new一塊記憶體後,把記憶體地址交給scoped_ptr管理,這樣就不用顯式呼叫delete了,當離開作用於後,該記憶體會被自動釋放,如

   int* p = new int;

   scoped_ptr<int> scoped_int_ptr(p);

  注意:無須再delete p;這樣會double free。另外一個重要的點是:scoped_ptr不允許傳遞指標,即他的拷貝構造和賦值函式都是private的,不允許呼叫,所以你不能寫如下程式碼

    scoped_ptr<int> scoped_int_ptr2 =  scoped_int_ptr; // 不允許

2.auto_ptr:它和scoped_ptr用法基本是一致的,但是它允許指標傳遞,拷貝構造和賦值函式允許呼叫,故名思意,當發生賦值時,原物件的指標會轉移給新物件,這時原物件的指標就為NULL了,不能再呼叫。所以,對指標要把握好,使用應謹慎。

3.shared_ptr:scoped_ptr一樣包裝了new操作符在堆上分配的動態物件,但它實現的是引用計數型的智慧指標 ,可以被自由地拷貝和賦值,在任意的地方共享它,當沒有程式碼使用(引用計數為0)它時才刪除被包裝的動態分配的物件。但是,shared_ptr注意不要有迴圈引用,否則會出現記憶體洩漏。例如:A和B物件互相引用,它們的引用計數都是1,當出了作用域之後,二者不能自動釋放,出現了記憶體洩漏。

4.weak_ptr:是一種智慧指標,它對被std::shared_ptr管理的物件存在非擁有性(“弱”)引用。在訪問所引用的物件前必須先轉換為std::shared_ptr。

std::weak_ptr用來表達臨時所有權的概念:當某個物件只有存在時才需要被訪問,而且隨時可能被他人刪除時,可以使用std::weak_ptr來跟蹤該物件。需要獲得臨時所有權時,則將其轉換為std::shared_ptr,此時如果原來的std::shared_ptr被銷燬,則該物件的生命期將被延長至這個臨時的std::shared_ptr同樣被銷燬為止。

此外,std::weak_ptr還可以用來避免std::shared_ptr的迴圈引用。