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

转载于:https://www.cnblogs.com/rooney/archive/2013/03/31/2992124.html

为什么要用 enable_shared_from_this ?相关推荐

  1. enable_shared_from_this理解

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

  2. boost 库 enable_shared_from_this 实现原理分析

    使用情景:当类对象被 shared_ptr 管理时,需要在类自己定义的函数里把当前类对象作为参数传给其他函数时,这时需要传递一个 shared_ptr ,否则就不能保持 shared_ptr 管理这个 ...

  3. boost::enable_shared_from_this相关的测试程序

    boost::enable_shared_from_this相关的测试程序 实现功能 C++实现代码 实现功能 boost::enable_shared_from_this相关的测试程序 C++实现代 ...

  4. 【Boost】boost库中的小工具enable_shared_from_this

    使用情景: 当类对象被 shared_ptr 管理时,需要在类自己定义的函数里把当前类对象作为参数传给其他函数时,这时需要传递一个 shared_ptr ,否则就不能保持 shared_ptr 管理这 ...

  5. 对于enable_shared_from_this、shared_from_this使用笔记

    文章为转载+汇总 参考:C++11标准库的一个工具类enable_shared_from_this的作用及原理分析 从这篇文章中可以知道: 当一个类public继承enable_shared_from ...

  6. boost::weak_ptr和enable_shared_from_this

    boost::weak_ptr和enable_shared_from_this shared_ptr在我的实践中使用很广,在接口层面上,我基本都会默认的使用shared_ptr.而weak_ptr则很 ...

  7. C++11新特性之十:enable_shared_from_this

    enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template< class T > class enable_shar ...

  8. 浅析 C++智能指针和 enable_shared_from_this 机制

    作者 | 小牛  责编 | 阿哲 头图 | CSDN 下载自视觉中国 来源 | 后端技术小牛说(ID:gh_acfd77ed3228) 今天跟聊一下 BAT 面试 C++ 开发工程师必问的一个考点:智 ...

  9. [C++11] enable_shared_from_this

    enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template< class T > class enable_shar ...

  10. 智能指针 enable_shared_from_this 陷阱

    2019独角兽企业重金招聘Python工程师标准>>> Tips:不要在 enble_shared_from_this 派生类中的构造函数中使用 weak_from_this() 或 ...

最新文章

  1. Android 中文 API (27) —— SeekBar.OnSeekBarChangeListener
  2. 工程制图 ( 标准件与常用件)
  3. 【好程序员笔记分享】——UIView与CALayer详解
  4. android 存储不被垃圾清理,手机内存足够大,就不需要清理垃圾了?你错了!
  5. vue请求PHP接口报错provisional headers are shown
  6. java获取当前项目或类路径
  7. python-学生管理系统--9-整体代码
  8. 魔兽世界服务器开启mysql_魔兽世界服务端Trinity编译安装
  9. 解决微信小程序wx:if使用不了函数,WXS使用方法以及防踩坑
  10. 2018最新微信小程序经典案例开发视频教程合集
  11. Yocto OpenCV交叉编译
  12. python从1 2 3 4 1000_Python语句序列“a=(1,2,3,None,(),[]);print(len(a))”的运行结果是()。 (2.0分)_学小易找答案...
  13. linux 输出到文件 新,如何将Linux命令输出保存到文件的两种方法
  14. 网工小记录(5):华为交换机acl配置、vpn-instance调用问题
  15. 离职后,你做这些事绝对会后悔
  16. 一个年轻人开始废掉时的三个表现,请保持警惕!!!
  17. 零基础CSS入门教程(1)——认识css
  18. Vectorworks 2023,3D建筑设计软件
  19. JumpServer 安装
  20. c语言编程 打印田字格,python用函数输出田字格

热门文章

  1. 如何使用Snagit修剪视频?
  2. 折腾Java设计模式之访问者模式
  3. 日本定了一个小目标,在2030年让五分之一的汽车实现自动驾驶
  4. A/B Testing
  5. tomcat 配置https 访
  6. 芒果 TV Redis 服务解决方案
  7. servlet执行流程代码分析
  8. 最新Tuxera NTFS for mac2020读写NTFS磁盘工具 更新详情介绍
  9. idm下载百度网盘有限制 提示403错误 下载显示没有权限404,最新的解决办法教程
  10. 公司发声明了!禁止所有程序员使用 Lombok !再使用绩效直接打C!