boost::scoped_ptr和std::auto_ptr非常類似,是乙個簡單的智慧型指標,它能夠保證在離開作用域後物件被自動釋放。下列**演示了該指標的基本應用:
#include
#include
#include
class implementation
void do_something()
};void test()
void main()
該**的輸出結果是:
test begin ...
did something
destroying implementation
test end.
可以看到:當implementation類離其開impl作用域的時候,會被自動刪除,這樣就會避免由於忘記手動呼叫delete而造成記憶體洩漏了。
boost::scoped_ptr特點:
boost::scoped_ptr的實現和std::auto_ptr非常類似,都是利用了乙個棧上的物件去管理乙個堆上的物件,從而使得堆上的物件隨著棧上的物件銷毀時自動刪除。不同的是,boost::scoped_ptr有著更嚴格的使用限制——不能拷貝。這就意味著:boost::scoped_ptr指標是不能轉換其所有權的。
不能轉換所有權
boost::scoped_ptr所管理的物件生命週期僅僅侷限於乙個區間(該指標所在的"{}"之間),無法傳到區間之外,這就意味著boost::scoped_ptr物件是不能作為函式的返回值的(std::auto_ptr可以)。
不能共享所有權
這點和std::auto_ptr類似。這個特點一方面使得該指標簡單易用。另一方面也造成了功能的薄弱——不能用於stl的容器中。
不能用於管理陣列物件
由於boost::scoped_ptr是通過
delete來刪除所管理物件的,而陣列物件必須通過
deletep來刪除,因此boost::scoped_ptr是不能管理陣列物件的,如果要管理陣列物件需要使用boost::scoped_array類。
boost::scoped_ptr的常用操作:
可以簡化為如下形式:
namespace boost ;
template
void swap(scoped_ptr& a, scoped_ptr& b); }
它的常用操作如下:
成員函式
功能
operator
*()
以引用的形式訪問所管理的物件的成員
operator
->()
以指標的形式訪問所管理的物件的成員
get()
釋放所管理的物件,管理另外乙個物件
swap(scoped_ptr& b)
交換兩個boost::scoped_ptr管理的物件
下列測試**演示了這些功能函式的基本使用方法。
#include
#include
#include
#include
#include
#include
void test()
void main()
boost::scoped_ptr和std::auto_ptr的選取:
boost::scoped_ptr和std::auto_ptr的功能和操作都非常類似,如何在他們之間選取取決於是否需要轉移所管理的物件的所有權(如是否需要作為函式的返回值)。如果沒有這個需要的話,大可以使用boost::scoped_ptr,讓編譯器來進行更嚴格的檢查,來發現一些不正確的賦值操作。
boost 智慧型指標
boost shared ptr 的記憶體管理機制 boost shared ptr 的管理機制其實並不複雜,就是對所管理的物件進行了引用計數,當新增乙個 boost shared ptr 對該物件進行管理時,就將該物件的引用計數加一 減少乙個 boost shared ptr 對該物件進行管理時,...
boost 智慧型指標
最近使用boost的智慧型指標,檢視了一些帖子。總結如下 智慧型指標分類 智慧型指標使用注意事項 多執行緒安全性分析 這個帖子的結論很好,1 shared ptr是乙個非常實用的智慧型指標。2 shared ptr的實現機制是在拷貝構造時使用同乙份引用計數。3 對同乙個shared ptr的寫操作不...
boost 智慧型指標
shared 指標類似於乙個帶計數器的指標,當指標計數次數為0時,它將自動析構物件。shared ptr指標可通過一次new出來,一直向下傳遞,直到每次析構shared ptr時將該指標引用量 1 注 每次進行不帶引用的傳遞時呼叫次數會加1,但析構時同時會 1,若用引用傳遞,每次呼叫值不增加,但同樣...