boost庫學習 智慧型指標

2021-09-24 17:42:16 字數 3415 閱讀 9192

智慧型指標是利用raii(在物件的建構函式中執行資源的獲取(指標的初始化),在析構函式中釋放(delete 指標):這種技法把它稱之為raii(resource acquisition is initialization:資源獲取即初始化))來管理資源。

其本質思想是:將堆物件的生存期用棧物件(智慧型指標)來管理。也就是當new乙個堆物件的時候,立刻用智慧型指標來接管,具體做法是在建構函式中進行初始化(用乙個指標指向堆物件),在析構函式呼叫delete來釋放堆物件。由於智慧型指標本身是乙個棧物件,它的作用域結束的時候會自動呼叫析構函式,從而呼叫delete釋放了堆物件。

這樣,堆物件就由智慧型指標(棧物件)管理了,不容易發生記憶體洩露或者是野指標。

c++98時期的智慧型指標auto_ptr已經被淘汰了。

c++11/14標準**現了unique_ptrshared_ptrweak_ptr,源於boost庫中的scoped_ptrshared_ptrweak_ptr(boost中共有6種智慧型指標)。

scoped_ptr包裝了new在堆上的動態物件,能保證物件能在任何時候都被正確的刪除。該智慧型指標只可以在本作用域內使用,其所有權不希望被轉讓,所以將拷貝建構函式,以及賦值過載函式包裝進private中。scoped_arrayscoped_ptr的唯一不同是scoped_array管理陣列物件。不建議使用scoped_array,可用vector替代。

部分scpoed_ptr**如下:

templateclass scoped_ptr // noncopyable

;

使用如下:

#include #include using namespace std;

class x

~x() };

int main(void)

cout << "exiting main ..." << endl;

return 0;

}

上述**中的main函式,首先通過new來進行類x的構造,呼叫x的建構函式,然後將其物件傳入智慧型指標中,在該指標作用域結束後,進行該指標的自動釋放,即自動呼叫析構函式(作用域為其中的構造**塊,即倆花括號之間)。

同時,可以通過reset()來釋放堆物件,其實現是通過交換來實現的。

void reset(t *p = 0)

void swap(scoped_ptr &b)

定義typedef scoped_ptr this_type, 當呼叫pp.reset()reset函式構造乙個臨時物件,它的成員px=0, 在swap函式中調換pp.px(this_type)(p).px, 即現在智慧型指標pp.px = 0(解綁),臨時物件接管了原生指標(即所有權可以交換),reset函式返回,離開了函式作用域,棧上的臨時物件析構,呼叫析構函式,進而delete px。

shared_ptr是最像指標的智慧型指標。shared_ptrscoped_ptr一樣包裝了new在堆上的動態物件,也不可以管理new產生的陣列指標,也沒有指標算術操作。但是shared_ptr實現了引用計數,可以自由拷貝賦值,在任意地方共享它,當沒有**使用它(引用計數為0)時,它才刪除被包裝的動態物件。shared_ptr可以被放在標準容器中,stl容器儲存指標的標準做法。

補充:shared_ptr消除了顯示呼叫delete,但是沒有消除顯示呼叫newboost提供乙個工廠函式make_shared來消除顯式new呼叫。例子如下:

void fun()

下面幾條規則能使我們更加安全的使用boost::shared_ptr:

避免對shared_ptr所管理的物件的直接記憶體管理操作,以免造成該物件的重釋放;

shared_ptr並不能對迴圈引用的物件記憶體自動管理(這點是其它各種引用計數管理記憶體方式的通病);

不要構造乙個臨時的shared_ptr作為函式的引數;

weak_ptr是為了配合shared_ptr而引入的,它沒有普通指標的行為,沒過載*和->。它最大的作用是協助shared_ptr工作,像旁觀者一樣觀測資源的使用情況。weak_ptr可以從乙個shared_ptr或者乙個weak_ptr物件構造,獲得物件資源觀測權。但是weak_ptr並沒有共享資源,它的構造不會引起引用計數的增加,也不會讓引用計數減少,它只是靜靜的觀察者。

部分**如下:

templateclass weak_ptr

; // weak_ptr

templateinline bool operator<(weak_ptrconst & a, weak_ptrconst & b);

templatevoid swap(weak_ptr& a, weak_ptr& b);

weak_ptr的引入主要是為了解決shared_ptr的迴圈引用的問題:

class node

typedef shared_ptrptr_type;

ptr_type next;

};int main()

//退出後,shared_ptr都正確析構

boost庫——四種智慧型指標的對比和注意點

詳解boost庫智慧型指標

Boost庫智慧型指標學習

參見 boost 程式庫完全開放指南 第3 章記憶體管理 所有示例,採用 vs2010 開發工具 vs2005 也適用 均為 win32 控制台程式。boost 庫的配置可參照 1 scoped ptr 內動態管理記憶體。但所有權不能轉讓,不能進行賦值操作。示例 如下。include stdafx....

boost庫智慧型指標

程式的記憶體資源管理一直是個比較麻煩的問題,c 程式在引入智慧型指標之前,new出來的記憶體,需要自己手動的銷毀,自己去管理申請堆記憶體的生命週期。有的時候難免會遺漏對資源的釋放銷毀。智慧型指標則能很好的解決記憶體管理的問題,不但能很好的管理裸指標,還能管理記憶體資源 raii 機制。前借助boos...

Boost庫系列 智慧型指標

合理使用boost智慧型指標,直接記憶體釋放問題,你只管new,不需考慮delete,甚至new也不用你new 例如由make shared函式返回shared ptr智慧型指標 1 標頭檔案 智慧型指標標頭檔案 使用make unique 函式用到 使用owner less所有權比較函式物件時用到...