C++中Boost的智能指針shared_ptr
boost::scoped_ptr雖然簡單易用,但它不能共享所有權(quán)的特性卻大大限制了其使用范圍,而boost::shared_ptr可以解決這一局限。顧名思義,boost::shared_ptr是可以共享所有權(quán)的智能指針,首先讓我們通過一個例子看看它的基本用法:
#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同時擁有了implementation對象的訪問權(quán)限,且當sp1和sp2都釋放對該對象的所有權(quán)時,其所管理的的對象的內(nèi)存才被自動釋放。在共享對象的訪問權(quán)限同時,也實現(xiàn)了其內(nèi)存的自動管理。
boost::shared_ptr的內(nèi)存管理機制:
boost::shared_ptr的管理機制其實并不復(fù)雜,就是對所管理的對象進行了引用計數(shù),當新增一個boost::shared_ptr對該對象進行管理時,就將該對象的引用計數(shù)加一;減少一個boost::shared_ptr對該對象進行管理時,就將該對象的引用計數(shù)減一,如果該對象的引用計數(shù)為0的時候,說明沒有任何指針對其管理,才調(diào)用delete釋放其所占的內(nèi)存。
上面的那個例子可以的圖示如下:
sp1對implementation對象進行管理,其引用計數(shù)為1
增加sp2對implementation對象進行管理,其引用計數(shù)增加為2
sp1釋放對implementation對象進行管理,其引用計數(shù)變?yōu)?
sp2釋放對implementation對象進行管理,其引用計數(shù)變?yōu)?,該對象被自動刪除
boost::shared_ptr的特點:
和前面介紹的boost::scoped_ptr相比,boost::shared_ptr可以共享對象的所有權(quán),因此其使用范圍基本上沒有什么限制(還是有一些需要遵循的使用規(guī)則,下文中介紹),自然也可以使用在stl的容器中。另外它還是線程安全的,這點在多線程程序中也非常重要。
boost::shared_ptr的使用規(guī)則:
boost::shared_ptr并不是絕對安全,下面幾條規(guī)則能使我們更加安全的使用boost::shared_ptr:
避免對shared_ptr所管理的對象的直接內(nèi)存管理操作,以免造成該對象的重釋放
shared_ptr并不能對循環(huán)引用的對象內(nèi)存自動管理(這點是其它各種引用計數(shù)管理內(nèi)存方式的通?。?。
不要構(gòu)造一個臨時的shared_ptr作為函數(shù)的參數(shù)。
如下列代碼則可能導致內(nèi)存泄漏:
void test()
{
foo(boost::shared_ptr<implementation>(new implementation()),g());
}正確的用法為:
void test()
{
boost::shared_ptr<implementation> sp (new implementation());
foo(sp,g());
}以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言 數(shù)據(jù)結(jié)構(gòu)鏈表的實例(十九種操作)
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)鏈表的實例(十九種操作)的相關(guān)資料,需要的朋友可以參考下2017-07-07
C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解
這篇文章主要介紹了C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解,用來進行環(huán)境變量的相關(guān)操作,需要的朋友可以參考下2015-09-09
解析一個有關(guān)sizeof用法的題目--sizeof(i++)
本篇文章是對一個關(guān)于sizeof用法的題目進行了詳細的分析介紹,需要的朋友參考下2013-06-06

