c++11之std::enable_shared_from_this入门

2023-10-31

一、std::enable_shared_from_this<T>应用场景  

在记录std::enable_shared_from_this之前,需要先看一下原始指针与shared_ptr在使用过程中一些问题。

   先看一代码段:

#include <QCoreApplication>
#include <memory>
#include <iostream>
#include <memory>

class Point;
typedef std::shared_ptr<Point> ptr_point;

class Point 
{
public:
    Point(int _x, int _y) : x(_x), y(_y) {

    }

    ~Point() {
        std::cout << "~Point()" << std::endl;
    }

    ptr_point get_this() {
        return ptr_point(this);
    }

private:
    int x;
    int y;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    {
        Point *raw_pointer = new Point(8, 9);

        std::shared_ptr<Point> ptr(raw_pointer);  //[line 1]
        std::shared_ptr<Point> ptr2(raw_pointer); //[line 2]

    }

    return a.exec();
}

上边代码[line 1] [line 2] 是使用原始指针(raw pointer)来创建了两个shared_ptr对象,这样做会造成一个严重问题那就是那一资源会被free两次。为啥会这样?如下图可以看看内存情况:ptr与ptr2指向同一资源(0x3ab8e0),但是两shared_ptr的引用计数器不是同一个,意味着同一资源要被释放两次,这绝对是严重错误。

     但是我们确实有这样一种应用场景:就如类Point被shared_ptr管理。且在该类的某成员函数中要把当前类对象作为参数传递给其他函数时,但又要避免上述问题出现。我们就可以使用std::enable_shared_from_this<T>。

二、std::enable_shared_from_this<T>使用方式

   1>让类A继承std::enable_shared_from_this<T>,同时将该类类名作为模板参数;

   2> 在类成员函数中使用shared_from_this()进行传递该类对象;

更改上边代码并观察内存情况:

#include <QCoreApplication>
#include <memory>
#include <iostream>
#include <memory>

class Point;
typedef std::shared_ptr<Point> ptr_point;

class Point : public std::enable_shared_from_this<Point>
{
public:
    Point(int _x, int _y) : x(_x), y(_y) {

    }

    ~Point() {
        std::cout << "~Point()" << std::endl;
    }

    ptr_point get_this() {
        return shared_from_this();
    }

private:
    int x;
    int y;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    {
        Point *raw_pointer = new Point(8, 9);

        std::shared_ptr<Point> ptr(raw_pointer);
        std::shared_ptr<Point> ptr2(ptr->get_this());

    }

    return a.exec();
}

 此时内存情况:

      这样被释放两次的问题得到解决。相信为啥要使用std::enable_shared_from_this<T>已经讲解清晰。对于其原理可以以后进行陈述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++11之std::enable_shared_from_this入门 的相关文章

随机推荐

  • Java代码实现本地创建文件,读取文件,删除指定目录下的文件

    目录 一 需求 二 实现 1 完成创建文件 写入文件 2 读取文件 3 删除文件 测试 注意 java的split方法分割字符串 分隔符如 及注意点 一 需求 1 创建文件夹 以规定格式保存信息到指定文件 并存放在相应目录下 2 在保存的目
  • 第一次实验:Protocol Layers

    第一次实验 Protocol Layers 捕获跟踪 Pick a URL and fetch it with wget or curl 检查跟踪 数据包结构 协议开销 复用密钥 Which Ethernet header field is
  • 服务器出现TIME_WAIT和CLOSE_WAIT的原因以及解决方法

    来自 http blog csdn net shootyou article details 6622226 昨天解决了一个HttpClient调用错误导致的服务器异常 具体过程如下 http blog csdn net shootyou
  • SpringBoot(一)——注解配置

    文章目录 一 简介 1 概述 2 特性 3 四大核心 二 搭建环境 三 入门小程序 HelloWorld 四 配置文件 1 YML文件 2 YML语法 lt 1 gt 基本语法 lt 2 gt 值的写法 1 字面量 数字 字符串 布尔 2
  • PLSQL Developer 代码助手卡顿优化

    支持付费优化 原因分析 代码助手卡顿来源于 不考虑网络和软件版本等影响 A 从已连接的数据库的数据字典中 读取该表的列信息 B 将读取到的列信息返回到plsql编辑器 并进行字符处理 然后显示 如何优化B 这个勾勾是维持IDE的代码和数据库
  • TCP/IP常见协议及协议号及端口号

    TCP IP常见协议及协议号及端口号 协议 ICMP 1 Internet控制报文协议 IGMP 2 Internet组管理协议 TCP 6 传输控制协议 EGP 8 外部网关协议 IGP 9 专用内部网关协议 UDP 17 用户数据报协议
  • 浅谈编程语言的函数与方法

    在编程中 函数 Function 和方法 Method 是非常重要的概念 都是在编程中用来执行特定功能的代码块 可以被调用或重复使用 从而提高代码的可读性 可维护性和重用性 函数 函数是一个独立的代码片段 它实现特定功能并返回结果 它可以独
  • muduo库源码分析和总结

    陈硕大神的muduo库设计巧 但是难读懂 这里简单做个总结 注意回调函数太多 需仔细研究回调的传递和调用 两个核心梳理主线 EventLoopThreadPool start EventLoop runInLoop 其次陈硕认为网络编程的本
  • 适合大学生兼职做的8个副业推荐

    说起在大学兼职赚钱 我总结了8个适合大学生的兼职方式 毕竟在大学想要自己的生活更精彩一点 仅靠家里给的生活费是显然不够的 如果你正在寻找一些适合大学生的兼职 那么以下这些兼职可能会是不错的选择 1 淘宝兼职设计 如果你的专业与设计有关 那么
  • java可变参数(不定向参数)

    java可变参数的作用 在编写方法的过程中 可能会遇见一个方法有不确定参数个数的情况 一般我们会用方法重载来解决问题 1 方法重载 解决参数个数不确定问题 2 public void method 3 public void method
  • python-selenium运行报chromedriver与chrome不匹配解决方案

    selenium common exceptions SessionNotCreatedException Message session not created This version of ChromeDriver only supp
  • kafka学习笔记总结

    kafka学习笔记总结 参考 http orchome com kafka index https blog csdn net qq 24084925 article details 78842844 角色说明 Message 通信的基本单
  • zabbix实现httpd监控

    zabbix z biks 是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix能监视各种网络参数 保证服务器系统的安全运营 并提供灵活的通知机制以让系统管理员快速定位 解决存在的各种问题 zabbi
  • Mixlab工作坊工具箱:talking face

    Talking face 是一种计算机图形学和人工智能的技术 可以实现将一段音频转换为逼真的人脸动画 它可以用于视频游戏 虚拟主持人 语音助手等应用中 使人机交互更加自然和生动 1 SadTalker Video Lip Sync 基于Sa
  • 无涯的技术与成长的迷茫

    记得上大学之前 老师会为我们规划好一切 什么时候要高考 在什么时间点应该掌握哪些技能 每天要学什么 作业是什么 什么时候要放假了 一切都清晰明了 忙碌 但也充实 而上了大学后 感受最深的一点就是迷茫 没有方向 再也没有人为自己规划好一个明确
  • 【Spring从入门到实战】第 6 讲:SpringBoot 的事务管理

    本文已收录于专栏 Spring从入门到实战 专栏前言 大家好 我是执梗 本专栏将从Spring入门开始讲起 详细讲解各类配置的使用以及原因 到使用SpringBoot进行开发实战 旨在记录学习生活的同时也希望能帮到大家 如果对您能有所帮助
  • Google Maven Replacer Plugin插件详解

    在Maven项目的构建过程中 对于Maven标准预定义变量 或者
  • Android Studio App开发入门之图形定制Drawable的讲解及实战(附源码 超详细必看)

    运行有问题或需要源码数据集请点赞关注收藏后评论区留言 图形Drawable Android把所有能够显示的图形都抽象为Drawable类 这里的图形不止是图片 还包括色块 画板 背景等等 包含图片在内的图形文件放在res的目录的各个draw
  • 本地改代码服务器同时修改,sync_web: 将本地的修改通过ftp一键同步到服务器上 ,非常适合维护多个网站并且经常改动代码的情况...

    sync web 将本地的修改通过ftp一键同步到服务器上 非常适合维护多个网站并且经常改动代码的情况 监测文件变动依赖于svn或git author hellstar 在ksc的sync web项目基础上改进 需要安装python2 7环
  • c++11之std::enable_shared_from_this入门

    一 std enable shared from this