为什么要用 enable_shared_from_this ?

转载 2011年01月09日 00:02:00

http://www.btsmth.com/show_snapshot.php?en_name=CPlusPlus&gid=314844

 

[合集] 请问boost中的enable_shared_from_this类问题

http://www.btsmth.com/show_snapshot.php?en_name=CPlusPlus&gid=314844
楼主 hma (If you think you can, you can.)
☆─────────────────────────────────────☆
   panrainbow (忧郁淡蓝) 于  (Tue Nov  9 11:48:38 2010)  提到:

引入enable_shared_from_this的原因是可以实现返回值为指向该类本身的
shared_ptr,为什么以this为拷贝构造函数参数不能完成引用计数的累加,而是用
weak_ptr却可以呢?
谢谢!


☆─────────────────────────────────────☆
   xiaoman (比目鱼) 于  (Tue Nov  9 12:16:25 2010)  提到:

enable_shared_from_this其实是一个简单的class,其内部包含指向自己的weak_ptr
加上enable_shared_from_this以后,其实是用了多重继承,
而且这个多重是有成员变量的(不是很好的习惯)

至于你说的问题,不明白“以this为拷贝构造函数参数不能完成引用计数的累加”

放一个简单代码上来看看

【 在 panrainbow (忧郁淡蓝) 的大作中提到: 】
: 引入enable_shared_from_this的原因是可以实现返回值为指向该类本身的
: shared_ptr,为什么以this为拷贝构造函数参数不能完成引用计数的累加,而是用
: weak_ptr却可以呢?
: ...................



☆─────────────────────────────────────☆
   panrainbow (忧郁淡蓝) 于  (Tue Nov  9 12:28:13 2010)  提到:

//可以实现引用计数累加
shared_ptr<T> shared_from_this()
{
      shared_ptr<T> p(_internal_weak_this);   //_internal_weak_this is
weak_ptr;
      BOOST_ASSERT(p.get() == this);
        return p;
}

//不能实现引用计数累加
shared_ptr<T> shared_from_this()
{
      shared_ptr<T> p(this);   //this is shared_ptr;
      BOOST_ASSERT(p.get() == this);
        return p;
}
请问这是为什么?
【 在 xiaoman (比目鱼) 的大作中提到: 】
: enable_shared_from_this其实是一个简单的class,其内部包含指向自己的
weak_ptr
: 加上enable_shared_from_this以后,其实是用了多重继承,
: 而且这个多重是有成员变量的(不是很好的习惯)
: ...................



☆─────────────────────────────────────☆
   xiaoman (比目鱼) 于  (Tue Nov  9 12:58:41 2010)  提到:

第2种写法是错的。这种特性是由shared_ptr的构造函数决定的,
可以这么理解:
如果shared_ptr通过裸指针T*来构造,那么代表的是这个shared_ptr<T>完全拥有它,
如果看进去相应的构造函数可以看到会new一个新的计数器结构体,
之后的结果就是对this至少多delete一次
简单代码可以这么描述:
template <typename T> class shared_ptr{
public:
   shared_ptr(T* p):{
 pn = new ref_pn(p); px = p;};
...
private:  T* px; ///raw pointer
ref_pn* pn; /// ref count struct
}

如果用weak_ptr构造,能工作是因为shared_ptr<T>写了一个特殊构造函数,
接受从weak_ptr<T>构造自己,
这个特殊构造函数会从weak_ptr<T>里找到引用计数结构体,并增加计数。
public:
  shared_ptr(weak_ptr<T> pw){
   *pn = *(pw.pn); px = pw.px;
}


【 在 panrainbow (忧郁淡蓝) 的大作中提到: 】
: //可以实现引用计数累加
: shared_ptr<T> shared_from_this()
: {
: ...................



☆─────────────────────────────────────☆
   xiaoman (比目鱼) 于  (Tue Nov  9 13:02:41 2010)  提到:

刚才伪代码写得有些问题,更新了

【 在 xiaoman (比目鱼) 的大作中提到: 】
: 第2种写法是错的。这种特性是由shared_ptr的构造函数决定的,
: 可以这么理解:
: 如果shared_ptr通过裸指针T*来构造,那么代表的是这个shared_ptr<T>完全拥有它,
: ...................



☆─────────────────────────────────────☆
   panrainbow (忧郁淡蓝) 于  (Tue Nov  9 13:55:42 2010)  提到:

明白了,谢谢前辈指教
【 在 xiaoman (比目鱼) 的大作中提到: 】
: 刚才伪代码写得有些问题,更新了

C++ boost库----share_from_this类的作用和实现原理

使用boost库时,经常会看到如下的类 class A:public enable_share_from_this 在什么情况下要使类A继承enable_share_from_this? 使用场...
  • acs713
  • acs713
  • 2014年06月07日 09:37
  • 7736

enable_share_from_this功能介绍

这个类很有意思,让一个被shared_ptr管理生命周期的类能够在自己的成员函数内部访问shared_ptr。有点绕。举个例子,下面的代码在函数f内部通过this构造了shared_ptr对象,然后打...

C++中基类继承 enable_shared_from_this 之后派生类无法使用 shared_from_this() 的解决方法

在很多情况下,我们会在基类中继承std::enable_shared_from_this 来使得在该类的方法中能够传递该类的this指针。例如:class Base : public std::ena...

enable_shared_from_this模板类使用完全解析

转自:http://hahaya.github.io/use-enable-shared-from-this/ enable_shared_from_this模板类使用完全解析 作...

enable_from_this方法的使用与陷阱

enable_from_this 的使用与实现原理说明: shared_from_this()是enable_shared_from_this的成员函数,返回shared_ptr; 注意的是,这个...

enable_shared_from_this解析

enable_shared_from_this解析        enable_shared_from_this,是一个以其派生类为模板类型实参的基础模板,继承它,this指针就能变成share...

使用enable_shared_from_this

使用enable_shared_from_this 说明 The header defines the class template enable_shared_from_this. It ...

shared_from_this

看陈硕的muduo代码库的时候,里面的TcpConnection用到了enable_shared_from_this这个基类,今天查了一下,这个基类提供了一个shared_from_this()公用方...
  • salutlu
  • salutlu
  • 2013年10月09日 17:17
  • 6839

enable_shared_from_this用法

shared_from_this()是enable_shared_from_this的成员 函数,返回shared_ptr。首先需要注意的是,这个函数仅在shared_ptr的构造函数被调用之后才能使...

boost 库 enable_shared_from_this 实现原理分析

http://blog.sina.com.cn/s/blog_62cd38470100g3dd.html使用情景:当类对象被 shared_ptr 管理时,需要在类自己定义的函数里把当前类对象作为参数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么要用 enable_shared_from_this ?
举报原因:
原因补充:

(最多只允许输入30个字)