是否有与shared_from_this等效的weak_ptr?

2024-04-08

我有一堂我知道的课会一直被拥有者std::shared_ptr。然而路过shared_ptr甚至weak_ptr不需要所有权或生命周期保证的函数和方法会产生不必要的开销。为了解决这个问题,我经常将原始指针传递给函数。该类本身继承自std::enable_shared_from_this因此,如果函数需要获取指针的所有权,它可以使用该类的方法来获取shared_ptr.

这一切都很顺利。然而,有些时候我真的不想做一个shared_ptr从原始指针,我想要的是weak_ptr.

据我了解通常的实施std::shared_ptr它有两个用作引用计数器的原子变量;一个为shared_ptr, 一个用于weak_ptr.

如果我只有一个指向我的类的原始指针,并且我想要一个weak_ptr,我必须首先创建一个shared_ptr并转换它。这样做意味着引用计数器会像这样改变:

  • 构造shared_ptr, 增量shared_ptr counter
  • 复制构造weak_ptr, 增量weak_ptr counter
  • Allow shared_ptr超出范围,减少shared_ptr counter

这似乎违背了“你不用为不使用的东西付费”的理念。有没有办法让我的班级只提供weak_ptr无需先创建shared_ptr?


提议P0033 http://wg21.link/p0033在 2015 年 10 月的会议上被接受为 C++17,其中添加了weak_from_this http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/weak_from_this到派生自的类std::enable_shared_from_this.

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

是否有与shared_from_this等效的weak_ptr? 的相关文章

随机推荐

  • 继承后受保护的成员行为。

    我对受保护的标识符有一些疑问 在 K Sierra 编写的 Sun Certified Java Programmer Study Guide 的第一章中 我发现了以下信息 一旦包外子类继承了受保护的成员 该成员 由子类继承 就成为子类外部
  • 将 Pandas 数据帧转换为时间序列

    我有一个熊猫数据框 Out 57 lastrun rate 0 2013 11 04 12 15 02 0 1 2013 11 04 13 14 50 4 2 2013 11 04 14 14 48 10 3 2013 11 04 16 1
  • 迭代器的无限产量

    我正在尝试学习一些红宝石 想象一下 我正在循环并执行一个长时间运行的过程 在这个过程中 我希望获得一个旋转器 只要需要就可以 所以我可以这样做 a aNow 0 skip setup a big loop print a aNow aNow
  • 在 beautiful soup 中使用 lambda 函数

    尝试匹配包含某些文本的链接 我正在做 links soup find all a href lambda x org in x 但这会引发 TypeError argument of type NoneType is not iterabl
  • 如何设计一个同时安全的多用户 Ajax Web 应用程序

    我有一个网页 显示来自服务器的大量数据 通信是通过ajax完成的 每次用户交互并更改此数据 假设用户 A 重命名某些内容 时 它都会告诉服务器执行该操作 然后服务器返回新更改的数据 如果用户 B 同时访问该页面并创建一个新的数据对象 它将再
  • 添加依赖项和库 .jar 后无法解析 json import Intellij

    将在线源中的 json lib 2 4 jdk15 jar 添加到项目依赖项后 我似乎无法解决此问题 提供的屏幕截图显示了我正在做的事情的演练 是的 我多次尝试过 使缓存无效并重新启动 The error 这是我的项目结构 cmd 或 文件
  • 如果字符串中间出现空字符怎么办?

    我知道字符串的结尾由空字符表示 但我无法理解以下代码的输出 include
  • Google Analytics - 记录出站链接 - 打开新窗口

    我用过以下通过谷歌分析记录出站链接 是否可以在新窗口中打开链接 a href a
  • netty DefaultChannelPipeline 异常捕获

    不幸的是 我不明白 netty 服务器的输出 BUILD SUCCESSFUL Total time 3 seconds Jul 27 2014 2 04 44 AM io netty handler logging LoggingHand
  • SQLite 数据库的大小有限制吗?

    我读过他们的限制常见问题解答 他们谈论了除整个数据库的限制之外的许多限制 这很容易从实施限制 http www sqlite org limits html page SQLite 数据库文件按页面组织 每个页面的大小是 512 和 SQL
  • 找到 nlogn 算法的下界

    原来的问题在这里讨论 在 O n log n 时间内找到特殊点 k 的算法 https stackoverflow com questions 7626813 algorithm to find special point k in on
  • LISP 中的变量和符号有什么区别?

    从范围上来说 内存中的实际实现 语法 例如 if let a 1 a 是变量还是符号 约尔格的回答指出了正确的方向 让我补充一点 我将讨论与 Common Lisp 类似的 Lisp 作为数据结构的符号 符号是 Lisp 中真实的数据结构
  • 如何在 scikit-learn 下绘制拟合高斯混合模型的概率密度函数?

    我正在努力完成一项相当简单的任务 我有一个浮点向量 我想将其拟合为具有两个高斯核的高斯混合模型 from sklearn mixture import GMM gmm GMM n components 2 gmm fit values va
  • 如何获取进程的输出并设置超时?

    设置超时值时如何获取进程的输出 我目前正在使用 Apache Commons IO utils 从进程的标准输出和错误输出创建字符串 下面的代码 带注释 适用于终止的进程 但是 如果进程不终止 主线程也不会终止 如果我取消注释掉注释掉的代码
  • 服务器推送:彗星 vs 猿?

    我读过一些关于彗星和 APE 的内容 哪一个更好 我希望用户看到其他用户更新的内容 就像谷歌波一样 而在comet中 有2个版本 iframe vs 传统的ajax 有什么区别 哪个更好 我不太明白 Thanks Comet 是一组可用于开
  • 将 Mac 二进制文件加载为动态库

    我正在使用没有源代码的二进制可执行文件进行一些逆向工程 在 Windows 上 我可以做的是使用 LoadLibrary 加载可执行文件 EXE 就像它是 DLL 文件一样 如果加载的文件不可重定位 我可以简单地重新定位加载器代码 为其他模
  • 正则表达式检查字符串是否仅包含字母数字字符和空格 - javascript

    这是我到目前为止所拥有的 function checkTitle reg w a reg test title val console log a 到目前为止 在我的测试中 它捕获了所有特殊字符 除了 我如何捕获所有特殊字符 包括 在当前函
  • numpy结构化数组添加记录

    我有一个像这样的结构化数组 a np array 0 1 2 10 11 12 dtype PositionX
  • 调用notifyDataSetChanged时android listview顺序发生变化

    全部 当我使用notifyDataSetChanged 时 列表视图显示顺序将发生变化 像这样 3 2 1 当前活动创建时 但是当我更改数据时 这将是 1 2 3 我不想改变顺序 我不明白为什么会发生这种情况 这是我的适配器类中的一段代码
  • 是否有与shared_from_this等效的weak_ptr?

    我有一堂我知道的课会一直被拥有者std shared ptr 然而路过shared ptr甚至weak ptr不需要所有权或生命周期保证的函数和方法会产生不必要的开销 为了解决这个问题 我经常将原始指针传递给函数 该类本身继承自std en