程式的記憶體資源管理一直是個比較麻煩的問題,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 資源獲取即初始化 來管理資源。其本質思想是 將堆物件的生存期用棧物件 智慧型指標 ...