boost::shared_ptr簡介
boost::shared_ptr屬於boost庫,定義在namespace boost中,包含標頭檔案#include便可以使用。
上篇boost::scoped_ptr中我們看到boost::scoped_ptr獨享所有權,不允許賦值、拷貝。
而boost::shared_ptr是專門用於共享所有權的,由於要共享所有權,其在內部使用了引用計數機制。同時也就意味著支援賦值和拷貝。
boost::shared_ptr也是用於管理單個堆記憶體物件的。
boost::shared_ptr詳解
應用例項**如下:
#include #include class int
~int()
void printvalue()
void testshared_ptr2()
std::cout << "testshared_ptr2 usecount: " << spint.use_count() << std::endl;
testshared_ptr(spint);
std::cout << "testshared_ptr2 usecount: " << spint.use_count() << std::endl;
編譯 error: 同樣,shared_ptr也沒有release函式
}
執行結果如下:
constructor: 10
printvalue: 10
printvalue: 20
printvalue: 30
testshared_ptr2 usecount: 1
printvalue: 30
testshared_ptr usecount: 2
testshared_ptr2 usecount: 1
destructor: 30
例項可見,boost::shared_ptr也可以很方便的使用。並且沒有release()函式。
關鍵的一點,boost::shared_ptr內部維護了乙個引用計數,由此可以支援複製、引數傳遞等。
boost::shared_ptr提供了乙個函式use_count(),此函式返回 boost::shared_ptr內部的引用計數。
檢視執行結果,我們可以看到在 testshared_ptr2函式中,引用計數為1,傳遞引數後(此處進行了一次複製),
在函式testshared_ptr內部,引用計數為2,在testshared_ptr返回後,引用計數又降低為1。
另外,由testshared_ptr2內建立智慧型指標物件,到函式結束再析構智慧型指標物件,確保釋放掉記憶體資源。
當我們需要使用乙個共享物件的時候,boost::shared_ptr是最佳選擇。
此例也正體現了boost::shared_ptr是支援值語義,提供引用計數機制及raii支援的智慧型指標。
boost::shared_ptr總結
boost::shared_ptr的管理機制其實並不複雜,就是對所管理的物件進行了引用計數。
當新增乙個boost::shared_ptr對該物件進行管理時,就將該物件的引用計數加一;
減少乙個boost::shared_ptr對該物件進行管理時,就將該物件的引用計數減一;
如果該物件的引用計數為0的時候,說明沒有任何指針對其管理,才呼叫delete釋放其所佔的記憶體。
boost::shared_ptr並不是絕對安全,下面幾條規則能使我們更加安全的使用boost::shared_ptr:
1.避免對shared_ptr所管理的物件的直接記憶體管理操作,以免造成該物件的重釋放
2.shared_ptr並不能對迴圈引用的物件記憶體自動管理(這點是其它各種引用計數管理記憶體方式的通病)。
3.不要構造乙個臨時的shared_ptr作為函式的引數。
如下列**則可能導致記憶體洩漏:
void test()
//正確的用法為:
void test()
當函式g()拋異常的時候就會洩露了,這個是boost文件上特地註明的標準bad practices。
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
智慧型指標學習
最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...
智慧型指標3
include include using namespace std define test smartptr class stub class sentry sentry private int lock template class refcountingtraits void unrefer...