boost庫智慧型指標

2021-09-19 23:05:56 字數 2458 閱讀 5276

程式的記憶體資源管理一直是個比較麻煩的問題,c++程式在引入智慧型指標之前,new出來的記憶體,需要自己手動的銷毀,自己去管理申請堆記憶體的生命週期。有的時候難免會遺漏對資源的釋放銷毀。智慧型指標則能很好的解決記憶體管理的問題,不但能很好的管理裸指標,還能管理記憶體資源(raii)機制。前借助boost庫開發指南,這裡做個簡單的講解。有不足地方請廣大讀者提出,感激不盡。

c++ 智慧型指標有比較多的版本,其中比較出名的是c++98中的std::auto_ptr指標。

auto_ptr 的建構函式接受new 操作符,或者物件工廠建立出的物件指標作為引數輸入。退出作用域時會呼叫auto_ptr的析構函式,使用delete操作符刪除原始指標釋放資源。使用比較簡單,

class cfg_res; //資源類

void test1()

和auto_ptr比較類似的乙個智慧型指標是scoped_ptr,從名字可以看出來該指標是在被宣告的作用域內使用,scoped_ptr類摘要中看出來,其建構函式和賦值操作符都是定義為private,禁止對指標進行複製,由於operator*() 和operator->()過載了指標的解引用操作,故可以使用*ptr 和ptr-> 操作符,下面貼一段書上的示例程式。

struct posi_file

~posi_file()

};int main()

p.reset();

assert(p==0);

if(!p)

scoped_ptrfp(new posi_file("./aa.txt"));

return 0;

}auto_ptr和scoped_ptr 同樣的缺陷不能作為容器的元素。前者是因為他的轉移語義,後者是因為不支援拷貝和賦值,不符合容器對元素的型別要求。

shared_ptr也可以像上面兩種智慧型指標一樣可以包裝new操作符在堆上分配的記憶體物件,主要的不同是其實現了記憶體的引用計數,改指標可以自由的被賦值和拷貝,在任何地方共享使用,當不使用改記憶體時,指標的引用計數為0,會自動的刪除被包裝的動態分配的記憶體。shared_ptr也可以安全的放入到標準庫的容器中。

下面看看其類的成員函式。

(1).template explicit shared_ptr(y* p);

建構函式獲取指標p 的所有權,但是p 指標一定是能指向y的有效指標,構造後引用計數為1。

(2).template shared_ptr(y* p,d d); 

建構函式帶有兩個引數,第乙個是需要管理的指標p,第二個是引用計數為0 ,需要釋放的資源物件,釋放資源的物件是以d(p)的形式傳給物件

(3).shared_ptr(const shared_ptr& r); 

從另外乙個shared_ptr獲取指標管理權,同時引用計數加1,結果是兩個shared_ptr管理乙個指標物件資源。

(4).shared_ptr();

無引數構造,建立乙個持有空指標的shared_ptr指標。

(5).operator= 賦值操作符可以從另外乙個shared_ptr或者auto_ptr獲取指標的管理權,引用計數置為1,同時auto_ptr會失去管理權。

(6).~shared_ptr(); 

析構函式對引用計數減1,如果引用計數為 0,則會刪除被儲存的指標物件,達到銷毀資源的目的,同時,如果自己定義自定義刪除器,則會呼叫自己定義的函式,按照定義的要求來釋放資源。

(7).void reset();

停止對儲存的指標的所有權的共享,引用計數減1.

(8).bool unique() const; 

shared_ptr是其儲存指標的唯一的管理者是返回true.

(9).long use_count() const; 

use_count 函式返回指標的引用計數,有的時候 這個操作是昂貴的,

(10).void swap(shared_ptr& b); 

交換兩個指標的shared_ptr,同時指標和引用計數也會交換。

下面來看乙個簡單的示例:

#include #include #include class implementation

int do_something() };

typedef boost::shared_ptrimple_; //智慧型指標

void test()

~a()

public:

shared_ptrm_b;

};class b

~b()

public:

shared_ptrm_a;

};class wa;

class wb;

class wa

~wa()

public:

weak_ptrm_b;

};class wb

~wb()

public:

weak_ptrm_a;

};void test1()

void test2()

int main()

Boost庫智慧型指標學習

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

Boost庫系列 智慧型指標

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

boost庫學習 智慧型指標

智慧型指標是利用raii 在物件的建構函式中執行資源的獲取 指標的初始化 在析構函式中釋放 delete 指標 這種技法把它稱之為raii resource acquisition is initialization 資源獲取即初始化 來管理資源。其本質思想是 將堆物件的生存期用棧物件 智慧型指標 ...