C++ 11 std::enable_shared_from_this

2023-10-26

C++11 std::enable_shared_from_this

一 介绍

1 申明

std::enable_shared_from_this
template< class T > class enable_shared_from_this;(C++11)

std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, … ) ,它们与 pt 共享对象 t 的所有权。一个使用场景是异常调用中的保活。

2 成员函数

`shared_from_this: 返回共享 *this 所有权的 shared_ptr

'weak_from_this (C++17): 返回共享 *this 所有权的 weak_ptr`

二 举例

#include <iostream>
#include <memory>
 
class A {
 public:
  A() {
    std::cout << "A()" << std::endl;
  }
  ~A() {
    std::cout << "~A()" << std::endl;
  }
 
  std::shared_ptr<A> ptr_dangerous() {
    return std::shared_ptr<A>(this);
  }
};
 
class B : public std::enable_shared_from_this<B> {
 public:
  B() {
    std::cout << "B()" << std::endl;
  }
  ~B() {
    std::cout << "~B()" << std::endl;
  }
 
  std::shared_ptr<B> ptr() {
    return shared_from_this();
  }
};
int main() {
  {
    std::cout << 1 << std::endl;
    auto p = std::make_shared<B>();
    auto p1 = p->ptr();
    std::cout << "use_count(): " << p.use_count() << std::endl;
  }
 
  {
    // error
    std::cout << 2 << std::endl;
    auto p = std::make_shared<A>();
    auto p1 = p->ptr_dangerous();
    std::cout << "use_count(): " << p.use_count() << std::endl;
  }
 
  system("pause");
  return 0;
}

结果:
在这里插入图片描述
A析构两次,导致程序崩溃。

三 参考

stackoverflow: std::enable_shared_from_this

cpprefrence: std::enable_shared_from_this

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

C++ 11 std::enable_shared_from_this 的相关文章

随机推荐

  • Java集合 —— Map集合

    目录 1 Map接口和Collection接口的不同 2 Map集合的特点 3 Map集合的功能 4 HashMap原理 谈谈你对HashMap的理解 HashMap的数据插入原理是怎样的 5 HashTable特点 6 LinkedHas
  • Unity游戏开发 怪物巡逻AI

    今天实现的内容是怪物AI 看了一些网上的AI 不是特别符合我的需求 于是就自己研究了一种AI 大致和魔兽类的RPG游戏效果差不多 AI效果如下 1 将怪物分为如下几个状态 待机状态 该状态内有3种行为 原地呼吸 原地观察 和游走 可通过权重
  • 汇编语言(王爽第三版)实验九

    实验九 题目与个人思路 编程 在屏幕中间分别显示绿色 绿底红色 白底蓝色的字符串 welcome to masm 在80 25彩色字符模式下 显示器可以显示25行 每行80个字符 根据题意大致效果如下图所示 11行的起始地址计算10 80
  • C语言典型例题二——杨辉三角

    C语言典型例题二 杨辉三角 杨辉三角 C语言中的位运算有哪些操作符 杨辉三角 1 杨辉三角最本质的特征是 它的两条斜边都是由数字1组成的 而其余的数则是等于它肩上的两个数之和 这就是我们用C语言写杨辉三角的关键之一 杨辉三角是一种数学工具
  • Android Looper原理源码分析

    概要 在很久以前的时候转载了一小篇文章 Android Message Queue Message Looper Handler 白话介绍了一下Android Message Queue Looper Handler这几个概念之间的关系 其
  • windows下 mysql忘记root的密码怎么办

    如果mysql忘记密码无法登入 可以通过绕开输入密码登入的方式进行修改 步骤如下 1 右击 此电脑 点击 管理 打开 计算机管理 点击 服务与应用程序 点击 服务 2 找到mysql 先右击停用 再次右击mysql的打开属性对话框 3 在属
  • 942、增减字符串匹配——贪心+vector初始化方法

    文章目录 一 题目描述 二 题目分析 三 代码实现 四 总结 1 回顾一下 vector texttt vector vector 容器的几种初始化操作 一 题目描述 942 增减字符串匹配 由范围 0 n 内所有整数组成的 n
  • Go中 go-sql-driver 的使用

    go sql driver 是 Go 语言中一个常用的 MySQL 数据库驱动程序 支持 MySQL5 5 MySQL5 6 和 MySQL5 7 本文将介绍如何使用 go sql driver 包连接 MySQL 数据库 安装 在命令行中
  • linux计划任务5个*分表代表什么,linux 設置定時任務crontab

    前言 做自動化測試寫的腳本需要設置定制任務 在指定的時間去執行 這就需要用到定時任務 之前用jenkins可以在里面設置定時任務 很好用 其實在linux上也可以用crontab做定時任務 cron 在LINUX中 周期執行的任務一般由cr
  • Python在工业自动化领域的应用详解

    当我们开始讨论在工业自动化应用中使用哪种编程语言时 通常我们会首先谈论IEC 61131 3标准中用于可编程逻辑控制器 PLC 的语言 比如经典的梯形图 LD 或结构化文本 ST 对于机器人等应用 我们经常看到低级编译语言 比如C语言 这几
  • python代码规范快捷键_VS Code写Python的一些小技巧

    原标题 VS Code写Python的一些小技巧 本文基于 VS Code 1 36 1 为什么要用 VS Code 用 PyCharm 不好吗 VS Code 是开源免费的 PyCharm 是收费的 VS Code 除了 Python 还
  • Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现

    保姆级别教程 获取图片的Glcm和基于Glcm的纹理特征 附讲解思路 python代码的实现 网络上Glcm的原理很多 但是实现的python代码我确实没找到 讲的也不是很清楚 此文介绍了如何在一张图片中得到Glcm灰度共生矩阵 并基于Gl
  • opencv中矩阵运算

    opencv中矩阵运算 标签 1 cvLoadImage 将图像文件加载至内存 2 cvNamedWindow 在屏幕上创建一个窗口 3 cvShowImage 在一个已创建好的窗口中显示图像 4 cvWaitKey 使程序暂停 等待用户触
  • 理解ROC曲线,TPR与FPR

    在垃圾邮件判别模型中 邮件被判别为垃圾邮件为positive 被判别为非垃圾邮件为negative 那么 TPR TP TP FN 的含义是 垃圾邮件被正常判别为垃圾邮件的比例 FPR FP FP TN 的含义是 非垃圾邮件被判别为垃圾邮件
  • STM32的RTC时钟配置

    STM32的时钟可以使用内部RTC产生时钟日历 也可以使用外部芯片产生更为精确的时钟 如DS3231时钟芯片 本文介绍使用内部RTC产生时钟 RTC的时钟源有以下三种 HSE时钟除以128 LSE振荡器时钟
  • java reference variable,Java中的Object,Reference ID和Reference Variable之间有什么区别?

    What is difference between the following in java Object Reference ID Reference Variable When I see statements like this
  • xml转json的两种方法

    1 第一种方法 使用JSON JAVA提供的方法 之前一直使用json lib提供的方法转json 后来发现了这个开源项目 觉得用起来很不错 并且可以修改XML java中的parse方法满足自己的转换需要 1 首先去git下载所需的jav
  • Golang#Typora-Golang笔记

    知名编程语言或系统的发展简史 一 B语言 B语言之父 Ken Thompson 肯 汤普森 B语言是贝尔实验室开发的一种通用的程序设计语言 它是于1969年前后Ken Thompson 肯 汤普森 在Dennis Ritchie丹尼斯 里奇
  • SSM框架学习(4)CRM项目物理模型设计

    1 CRM的表结构 tbl user 用户表 tbl dic type 数据字典类型表 tbl dic value 数据字典值 tbl activity 市场活动表 tbl activity remark 市场活动备注表 tbl clue
  • C++ 11 std::enable_shared_from_this

    C 11 std enable shared from this 一 介绍 1 申明 std enable shared from this template lt class T gt class enable shared from t