C++中Boost的智能指針shared_ptr
boost::scoped_ptr雖然簡(jiǎn)單易用,但它不能共享所有權(quán)的特性卻大大限制了其使用范圍,而boost::shared_ptr可以解決這一局限。顧名思義,boost::shared_ptr是可以共享所有權(quán)的智能指針,首先讓我們通過一個(gè)例子看看它的基本用法:
#include <string> #include <iostream> #include <boost/shared_ptr.hpp> class implementation { public: ~implementation() { std::cout <<"destroying implementation\n"; } void do_something() { std::cout << "did something\n"; } }; void test() { boost::shared_ptr<implementation> sp1(new implementation()); std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n"; boost::shared_ptr<implementation> sp2 = sp1; std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n"; sp1.reset(); std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n"; sp2.reset(); std::cout<<"After Reset sp2.\n"; } void main() { test(); }
該程序的輸出結(jié)果如下:
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
destroying implementation
After Reset sp2.
可以看到,boost::shared_ptr指針sp1和sp2同時(shí)擁有了implementation對(duì)象的訪問權(quán)限,且當(dāng)sp1和sp2都釋放對(duì)該對(duì)象的所有權(quán)時(shí),其所管理的的對(duì)象的內(nèi)存才被自動(dòng)釋放。在共享對(duì)象的訪問權(quán)限同時(shí),也實(shí)現(xiàn)了其內(nèi)存的自動(dòng)管理。
boost::shared_ptr的內(nèi)存管理機(jī)制:
boost::shared_ptr的管理機(jī)制其實(shí)并不復(fù)雜,就是對(duì)所管理的對(duì)象進(jìn)行了引用計(jì)數(shù),當(dāng)新增一個(gè)boost::shared_ptr對(duì)該對(duì)象進(jìn)行管理時(shí),就將該對(duì)象的引用計(jì)數(shù)加一;減少一個(gè)boost::shared_ptr對(duì)該對(duì)象進(jìn)行管理時(shí),就將該對(duì)象的引用計(jì)數(shù)減一,如果該對(duì)象的引用計(jì)數(shù)為0的時(shí)候,說明沒有任何指針對(duì)其管理,才調(diào)用delete釋放其所占的內(nèi)存。
上面的那個(gè)例子可以的圖示如下:
sp1對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)為1
增加sp2對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)增加為2
sp1釋放對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)變?yōu)?
sp2釋放對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)變?yōu)?,該對(duì)象被自動(dòng)刪除
boost::shared_ptr的特點(diǎn):
和前面介紹的boost::scoped_ptr相比,boost::shared_ptr可以共享對(duì)象的所有權(quán),因此其使用范圍基本上沒有什么限制(還是有一些需要遵循的使用規(guī)則,下文中介紹),自然也可以使用在stl的容器中。另外它還是線程安全的,這點(diǎn)在多線程程序中也非常重要。
boost::shared_ptr的使用規(guī)則:
boost::shared_ptr并不是絕對(duì)安全,下面幾條規(guī)則能使我們更加安全的使用boost::shared_ptr:
避免對(duì)shared_ptr所管理的對(duì)象的直接內(nèi)存管理操作,以免造成該對(duì)象的重釋放
shared_ptr并不能對(duì)循環(huán)引用的對(duì)象內(nèi)存自動(dòng)管理(這點(diǎn)是其它各種引用計(jì)數(shù)管理內(nèi)存方式的通?。?。
不要構(gòu)造一個(gè)臨時(shí)的shared_ptr作為函數(shù)的參數(shù)。
如下列代碼則可能導(dǎo)致內(nèi)存泄漏:
void test() { foo(boost::shared_ptr<implementation>(new implementation()),g()); }
正確的用法為:
void test() { boost::shared_ptr<implementation> sp (new implementation()); foo(sp,g()); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入學(xué)習(xí)C語言中memset()函數(shù)的用法
這篇文章主要介紹了深入學(xué)習(xí)C語言中memset()函數(shù)的用法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08C語言 數(shù)據(jù)結(jié)構(gòu)鏈表的實(shí)例(十九種操作)
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)鏈表的實(shí)例(十九種操作)的相關(guān)資料,需要的朋友可以參考下2017-07-07C語言設(shè)計(jì)前中后隊(duì)列實(shí)例代碼
隊(duì)列最主要的作用就是用來管理數(shù)據(jù)流的,防止數(shù)據(jù)因?yàn)閭鬏旑l率過快得不到及時(shí)處理而丟失,下面這篇文章主要給大家介紹了關(guān)于C語言設(shè)計(jì)前中后隊(duì)列的相關(guān)資料,需要的朋友可以參考下2021-12-12C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解
這篇文章主要介紹了C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解,用來進(jìn)行環(huán)境變量的相關(guān)操作,需要的朋友可以參考下2015-09-09解析一個(gè)有關(guān)sizeof用法的題目--sizeof(i++)
本篇文章是對(duì)一個(gè)關(guān)于sizeof用法的題目進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C語言實(shí)現(xiàn)飛機(jī)票務(wù)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)飛機(jī)票務(wù)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12