对象管理Boost智能指针——shared_ptr
PS:今天上午,非常郁闷,有很多简略基础的问题搞得我有些迷茫,哎,码代几天不写就忘。目前又不当COO,还是得用心记码代哦!
boost::scoped_ptr虽然简略易用,但它不能享共全部权的性特却大大制限了其用使范围,而boost::shared_ptr可以处理这一范围。义思名顾,boost::shared_ptr是可以享共全部权的智能指针,首先让我们通过一个例子看看它的基本用法:
#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();
}
该序程的输出结果如下:
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对象的问访权限,且当sp1和sp2都放释对该对象的全部权时,其所管理的的对象的内存才被主动放释。在享共对象的问访权限同时,也现实了其内存的主动管理。
boost::shared_ptr的内存管理机制:
boost::shared_ptr的管理机制其实其实不庞杂,就是对所管理的对象停止了用引计数,当新增一个boost::shared_ptr对该对象停止管理时,就将该对象的用引计数加一;少减一个boost::shared_ptr对该对象停止管理时,就将该对象的用引计数减一,如果该对象的用引计数为0的时候,说明没有任何指针对其管理,才调用delete放释其所占的内存。
面上的那个例子可以的图示如下:
-
sp1对implementation对象停止管理,其用引计数为1
-
加增sp2对implementation对象停止管理,其用引计数加增为2
-
sp1放释对implementation对象停止管理,其用引计数为变1
-
sp2放释对implementation对象停止管理,其用引计数为变0,该对象被主动删除
boost::shared_ptr的点特:
和面前分析的boost::scoped_ptr比拟,boost::shared_ptr可以享共对象的全部权,因此其用使范围基本上没有什么制限(还是有一些须要遵守的用使规矩,下文中分析),然自也可以用使在stl的容器中。另外它还是线程安全的,这点在多线程序程中也非常重要。
boost::shared_ptr的用使规矩:
boost::shared_ptr其实不是绝对安全,面下几条规矩能使我们更加安全的用使boost::shared_ptr:
-
免避对shared_ptr所管理的对象的直接内存管理操纵,以免形成该对象的重放释
-
shared_ptr其实不能对循环用引的对象内存主动管理(这点是其它各种用引计数管理内存式方的通病)。
-
不要造构一个临时的shared_ptr作为数函的参数。
如下列码代则可能致使内存泄漏:
void test()
{
foo(boost::shared_ptr<implementation>(new implementation()),g());
}
确正的用法为 :
void test()
{
boost::shared_ptr<implementation> sp (new implementation());
foo(sp,g());
}
文章结束给大家分享下程序员的一些笑话语录:
苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)