zoukankan      html  css  js  c++  java
  • 为什么要用 enable_shared_from_this ?

    [合集] 请问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 (比目鱼) 的大作中提到: 】
    : 刚才伪代码写得有些问题,更新了

  • 相关阅读:
    反编译工具
    3.25Java变量
    标识符
    OMS系统
    java打印方法区别
    注释
    写代码时候要注意的两个点
    python_pracyoce_day1
    SKU和SPU
    文档注释
  • 原文地址:https://www.cnblogs.com/rooney/p/2992124.html
Copyright © 2011-2022 走看看