why enable_shared_from_this
来源:互联网 发布:怎么成为淘宝模特 编辑:程序博客网 时间:2024/05/25 21:35
为什么会有 tr1::enable_shared_from_this 这个类,一直不解,直到看了Stephan T. Lavavej给出的关于shared_ptr 的PPT。 Stephan T. Lavavej是Visual C++ Libraries Developer。
他给的例子是:
struct Ansible {
shared_ptr<Ansible> get_shared() {
shared_ptr<Ansible> ret(this);
return ret;
}
};int main() {
shared_ptr<Ansible> a(new Ansible);
Ansible& r = *a;
shared_ptr<Ansible> b = r.get_shared();
}Result: DOUBLE DELETION
然后使用enable_shared_from_this 就对了:
struct Ansible
: public enable_shared_from_this<Ansible> { };int main() {
shared_ptr<Ansible> a(new Ansible);
Ansible& r = *a;
shared_ptr<Ansible> b = r.shared_from_this();
}a and b share ownership, as if:
shared_ptr<Ansible> b = a;
为什么?看看enable_shared_from_this 的实现:
template<class _Ty> class enable_shared_from_this
{ // provide member functions that create shared_ptr to this
public:
typedef _Ty _EStype;shared_ptr<_Ty> shared_from_this()
{ // return shared_ptr
return shared_ptr<_Ty>(_Wptr);
}shared_ptr<const _Ty> shared_from_this() const
{ // return shared_ptr
return shared_ptr<const _Ty>(_Wptr);
}protected:
enable_shared_from_this()
{ // construct (do nothing)
}enable_shared_from_this(const enable_shared_from_this& _Right)
: _Wptr(_Right._Wptr)
{ // construct
}enable_shared_from_this& operator=(const enable_shared_from_this& _Right)
{ // assign
_Wptr = _Right._Wptr;
return *this;
}~enable_shared_from_this()
{ // destroy (do nothing)
}private:
template<class _Ty1,
class _Ty2>
friend void _Do_enable(
_Ty1 *,
enable_shared_from_this<_Ty2>*,
_Ref_count_base *);mutable weak_ptr<_Ty> _Wptr;
};
enable_shared_from_this 的member可是一个weak_ptr.
当然,从enable_shared_from_this继承后,遇到shared_ptr后,member _Wptr 是怎样工作的,另有玄机。 可以设断点在 _Do_enable 里,有助于理解。
看似简单的share_ptr, 被实现的看似危机四伏。
- why enable_shared_from_this
- enable_shared_from_this
- enable_shared_from_this
- enable_shared_from_this
- enable_shared_from_this
- 使用enable_shared_from_this
- 使用enable_shared_from_this
- enable_shared_from_this用法
- 使用enable_shared_from_this
- enable_shared_from_this使用
- 使用enable_shared_from_this
- enable_shared_from_this解析
- 使用enable_shared_from_this
- 使用enable_shared_from_this
- BOOST enable_shared_from_this
- boost::enable_shared_from_this
- 使用enable_shared_from_this
- enable_shared_from_this解析
- iframe无刷新上传文件
- dirent
- 将截断字符串或二进制数据。
- linux内核完全注释---学习札记--引导启动程序boot
- sprintf,vsprintf,va_list的使用!
- why enable_shared_from_this
- Gridview 添加滚动条
- Android JNI知识简介
- boost::weak_ptr和enable_shared_from_this
- 设计巴特沃思滤波器matlab实现[转载]
- Android使用socket使底层和framework通信
- 利用commons-fileupload组件实现文件上传-实例
- javascript变量
- TC 3D模型绘图