文章为转载+汇总
参考:C++11标准库的一个工具类enable_shared_from_this的作用及原理分析
从这篇文章中可以知道:
当一个类public继承enable_shared_from_this时,会获得一个共有方法shared_from_this:

class T : public enable_shared_from_this<T> {};
shared_ptr<T>  shared_from_this();

这个东西的引入是为了解决下面的这个问题:
某个类的对象内存的生命周期由智能指针来管理,此时要在一个类的成员函数中,对外部返回shared_ptr构造的this指针会有问题。注意这里返回原生的this指针是可以的。
核心的问题,就是:

    1. 如果采用返回拷贝,那么临时变量会把this析构掉
    1. 如果采用返回引用,那么obj对象本身必须持有一个管理他的shared_ptr,这样会导致obj永远不会被释放
      可用的解决方案有以下两种
void getSharedFromParam(shared_ptr<obj>& p) {p.reset(this);    // 通过函数参数来实现规避掉拷贝语义,但是这样太过于丑陋}shared_ptr<obj> getSharedFromThis() {return shared_from_this();  // 这是C++11推荐的方法,可以实现安全的返回一个shared_ptr<this>,返回到外面的shared_ptr的拷贝的use_count是1,不用担心this被意外delete和引用计数异常的问题。}

注意:当你想使用getSharedFromThis时,必须以智能指针构造,而非以raw指针形式。否则会报std::bad_weak_ptr的错

int main() {auto p =std::make_shared<obj>();// auto p = new obj();p->getSharedFromThis()->doSomething();
}

enable_shared_from_this类中使用了一个私有weak_ptr来保存地址,在shared_from_this()通过把这个weak_ptr转换为引用计数为1的shared_ptr返回,避免了临时shared_ptr析构导致this被delete。

对于enable_shared_from_this、shared_from_this使用笔记相关推荐

  1. shared_ptr四宗罪

    本文版权归 liancheng 所有,如有转载请按如下方式标明原创作者及出处,以示尊重!! 原创作者:liancheng 原文出处:http://blog.liancheng.info/?p=85 在 ...

  2. Effective Modern C++读书笔记

    本笔记主要用于记录要领.体会及摘抄书中精华 第1章 类型推导 1.1 理解模板类型推导 在模板类型推导过程中 具有引用(&)或指针(*)类型的实参会被当成非引用类型来处理.换言之,其引用或指针 ...

  3. enable_shared_from_this理解

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

  4. boost 库 enable_shared_from_this 实现原理分析

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

  5. boost::shared_ptr shared_from_this

    需要将指针再构造为一个shared_ptr时, 可以让类继承自enable_shared_from_this: 然后类内部使用shared_from_this()生成一个shared_ptr. 不能直 ...

  6. Boost asio学习笔记之二—— 网络编程

    boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...

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

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

  8. Shared_from_this 几个值得注意的地方

    shared_from_this()是enable_shared_from_this<T>的成员 函数,返回shared_ptr<T>.首先需要注意的是,这个函数仅在share ...

  9. boost::weak_ptr和enable_shared_from_this

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

最新文章

  1. centos搭建kvm
  2. linux shell输出数字小数点前少了0_南京课工场IT培训:SHELL 超详细基础知识,适合新手小白(一)
  3. MIT警示“深度学习过度依赖算力”,研究三年算法不如用10倍GPU
  4. 用OWA访问Exchange邮箱
  5. 解决apt-get /var/lib/dpkg/lock-frontend 问题
  6. python语法箭头_Python中的函数注释:参数有冒号,声明后有- 箭头
  7. 用 Ansible 实现基于 OpenShift (Kubernetes) 的 DevOps
  8. python3 x版本的默认编码_python3.x设置默认编码(sys.stdout.encoding和sys.defaultencoding)...
  9. MySQL 基础操作
  10. 山东大学项目实训开发日志一——基于vue+springboot的医院耗材管理系统
  11. mysql sjis 校对乱码_MySQL字符集乱码及解决方案分享
  12. xtrabackup 原理详解
  13. 用python爬取链家二手房楼盘
  14. 【今日头条测试开发笔试】部分题目总结
  15. 计算机术语 打桩,动力打桩公式
  16. perl novel可变剪接识别(1)
  17. 阿里云物联网平台python_基于阿里云物联网平台,我们这样实现简易出入监控
  18. React学习的小总结(一)
  19. Node.js学习6~nodejs报Error: Cannot find module ‘express‘
  20. Ubuntu共享文件夹设置

热门文章

  1. hive分区用2个字段有何限制_Hive分区表和桶表的使用
  2. 浙江大学计算机研究生分数线初试单科学科,计算机考研|这两所自划线,单科没过线也能复试?!...
  3. 导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率
  4. php换设备登录逻辑,登录和退出登录的操作逻辑
  5. AngularJS快速入门指南03:表达式
  6. Day2 HTML基本标签元素
  7. JS加密算法简单分析
  8. 玩转Jquery中的动画效果(animate方法)
  9. Html5结合JS实现浏览器全屏功能
  10. USACO 6.3 章节 你对搜索和剪枝一无所知QAQ