异想天开

What's the true meaning of light, Could you tell me why

boost库shared_ptr共享指针

日期:2014-03-13 19:41:18
  
最后更新日期:2015-10-04 12:03:26
打算弄清楚boost库里shared_ptr指针的原理,共享指针的设计思想大多是资源获得即初始化。开始一头钻进源代码的陷阱,后来才想起忘记了一个方法,可以用gdb来跟踪一下其构造,析构过程即可。走了弯路,记之记之。一个作用域的智能指针大概类似这样,仅考虑整型数:
[code lang="cpp"]
class test{
public:
test(int *p):data(p){}
~test(){
delete data;
}
int *data;
}
[/code]
boost库的名为shared_ptr的智能指针是带引用计数的智能指针。当没有引用的时候,就删除delete它。gdb调试一下一个简单的模拟程序,看到shared_ptr的赋值函数,觉得这里包含了一点奥妙的地方。
[code lang="cpp"]
shared_ptr & operator=( shared_ptr const & r ) BOOST_NOEXCEPT
{
this_type(r).swap(*this);
return *this;
}[/code]
这个函数先用r来构造一个临时对象,然后swap对象内容。这样r就被换到赋值左边的对象,而原来的左边的对象就到了这个临时对象里,通过临时对象退出其作用域调用解析函数。这就是《effective c++》里面讲到的,异常安全的赋值函数写法。
注意事项:
1.shared_ptr不存放类似shared_ptr ptr( new int[5]);这样做是不行的,当然如果非要较劲也是有方法的,对于这种数组,boost库提供了另外的shared_array。
2.shared_ptr有循环引用的毛病,参考二是一个例子。
3.shared_ptr更广泛的用于资源的申请,释放。
共享指针用法示例:
[code lang="cpp"]
shared_ptr<FILE> fp(fopen(LOCK_FILE_NAME,"w+"),fclose);
if(NULL==fp.get()){
get_last_error("lock file error");
return 3;
}
[/code]
PS:用共享指针get方法可以得到原始类型的指针,释放智能指针对象的回调函数要满足这样的形式release_cb(p)。
参考:
1.shared_ptr使用