boost::weak_ptr和enable_shared_from_this
来源:互联网 发布:aws azure 阿里云 编辑:程序博客网 时间:2024/05/16 14:06
boost::weak_ptr和enable_shared_from_this
shared_ptr在我的实践中使用很广,在接口层面上,我基本都会默认的使用shared_ptr.而weak_ptr则很少使用;即便使用,也是间接的使用,例如使得class A继承自boost::enable_shared_from_this,这样A便具有了一个weak_ptr的成员对象,我便可以通过接口shared_from_this()得到一个boost::shared_ptr<A>的对象.
除此之外,在实践中我几乎没有用到weak_ptr.到目前为止,我见到的对weak_ptr论述最好的是<< Beyond.the.C.plus.plus.Standard.Library.An.Introduction.to.Boost>>.本书给出了使用weak_ptr的三种场景: 打破递归的依赖关系;使用一个共享的资源而不需要共享所有权;避免悬空的指针.
后面两种场景相对比较容易明白,对于第一种则相对模糊.最近几天我相对仔细的研究了一下shared_ptr和weak_ptr的源代码,给出我自己的理解如下.
weak_ptr是依附于shared_ptr的,所以首先要把shared_ptr弄清楚;另外,我认为boost::enable_shared_from_this是解释递归的依赖关系的最好例子,所以使用这个实例解释weak_ptr最好不过了.
shared_ptr的图解
object
counter
Object_ptr
counter_ptr
Object_ptr
counter_ptr
Object_ptr
counter_ptr
如图所示,3个智能指针对象sp1,sp2,sp3,共享同一个对象object和同一个计数器counter,当3个指针对象sp1,sp2,sp3声明周期结束的时候,counter==0,object会被销毁(当然,这个销毁器本身可以由你定制).
shared_ptr的一个很大的特点是:counter==0,object会被销毁;反之,如果counter总是不为0,那么object会成为永久对象,例如全局对象.
在http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/sp_techniques.html 中给出了一个从this获得shared_ptr的实例,答案是使用weak_ptr,问题是为什么是weak_ptr.
让我们把这个问题重新说明一下:
struct X
{
boost::shared_ptr<X> getX()
{
boost::shared_ptr<X> r ;//????如何实现
return r;
}
};
要得到X的智能指针,只是在对象指针是受shared_ptr保护的基础上的,举例如下:
void test_X()
{
{
X x;
boost::shared_ptr<X> px = x.getX();//错误
}
{
X* x = new X();
boost::shared_ptr<X> px = x->getX();//错误
}
{
boost::shared_ptr<X> x (new X());
boost::shared_ptr<X> px = x->getX();//正确
}
}
我们再回到原来的问题上,如何实现X::getX()函数.要构造X的智能指针,需要知道两个信息,object的指针和object的计数器,显然,指针本身可以通过this获得,问题是如何获得计数器,也即上面图中的counter.很显然,我们必须在X上存储某些信息来得到计数器.
最先想到的也许是使用一个指向counter的指针存储在X上面,这样应该是可以的,但是存在一个问题:暴露了shared_ptr的实现细节,虽然shared_ptr是基于计数器的,但是这不属于用户需要知道的事情.最好的方式是让shared_ptr本身来充当这个角色,这样所有的实现细节就都封装在shared_ptr内部了.
经过这样改装的shared_ptr的图解是:
counter
Object_ptr
counter_ptr
Object_ptr
counter_ptr
Object_ptr
counter_ptr
object
Object_ptr
counter_ptr
经过这样包装的object,问题立刻暴露出来:循环引用,造成object对象无法释放,成为”全局对象”.很显然,问题在于object本身参与了引用计数,也就是所有权的分享.我们需要的是不同于shared_ptr的这样的一类共享指针:他们并不参与对象的所有权,只是能够观察到对象的所有权.而这正是weak_ptr的本质所在.
当然了,weak_ptr还有其他的特征:查看对象指针是否过期(这也是比裸指针好的地方).
循环引用的情况很罕见,这可能也是我在实际中很少使用weak_ptr的原因吧.
- boost::weak_ptr和enable_shared_from_this
- boost::weak_ptr和enable_shared_from_this
- boost::weak_ptr和enable_shared_from_this
- boost::weak_ptr和enable_shared_from_this
- boost::weak_ptr和enable_shared_from_this
- boost::weak_ptr和enable_shared_from_this
- boost::weak_ptr和enable_shared_from_this
- weak_ptr 和enable_shared_from_this
- enable_shared_from_this、weak_ptr、shared_ptr
- BOOST enable_shared_from_this
- boost::enable_shared_from_this
- boost::shared_ptr 和 boost::weak_ptr 和 scoped_ptr
- weak_ptr,enable_shared_from_this 的使用举例
- boost::weak_ptr
- boost笔记(二) shared_ptr和weak_ptr
- boost智能指针之shared_ptr和weak_ptr
- boost shared_ptr: enable_shared_from_this验证
- boost::enable_shared_from_this分析
- django1.4新特性
- 创建渐变颜色
- 一些有意思的算法代码
- 同步、异步、阻塞、非阻塞 I/O 及 异步I/O实现
- 查找所有可执行文件的脚本
- boost::weak_ptr和enable_shared_from_this
- 三个有用的Switch命令:spanning-tree portfast、switchport host、smartport
- Drools入门-----------环境搭建,分析Helloworld
- no ip redirects no ip unreachables -----仅作参考
- 解决办法:Access restriction: The type JPEGImageEncoder is not accessible due to restriction on required
- PHP学习之memcached一致性哈希算法
- NSDateFormatter的格式字符串
- Asp.net中把DataTable或DataGrid导出为Excel
- 《设计模式解析》 第13章 用模式解决CADCAM问题 复习题