为此获得提升::shared_ptr

2024-01-20

我正在广泛使用boost:shared_ptr在我的代码中。事实上,大多数分配在堆上的对象都由一个shared_ptr。不幸的是,这意味着我无法通过this进入任何需要一个函数shared_ptr。考虑这段代码:

void bar(boost::shared_ptr<Foo> pFoo)
{
    ...
}

void Foo::someFunction()
{
    bar(this);
}

这里有两个问题。首先,这不会编译,因为 T* 构造函数shared_ptr是明确的。其次,如果我强迫它构建bar(boost::shared_ptr<Foo>(this))我将创建第二个指向我的对象的共享指针,这最终将导致双重删除。

这让我想到了我的问题:是否有任何标准模式可以从这些对象之一的方法内部获取您知道存在的现有共享指针的副本?使用侵入式引用计数是我唯一的选择吗?


你可以从启用_shared_from_this http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/enable_shared_from_this.html然后您可以使用“shared_from_this()”而不是“this”来生成指向您自己的 self 对象的共享指针。

链接中的示例:

#include <boost/enable_shared_from_this.hpp>

class Y: public boost::enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

当从成员函数生成线程以 boost::bind 到 shared_from_this() 而不是 this 时,这是一个好主意。它将确保该对象不被释放。

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

为此获得提升::shared_ptr 的相关文章

  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • 编译器消息“警告:格式‘%s’需要类型‘char *’,但参数 2 具有类型‘char (*)’”

    我正在尝试运行一个简单的 C 程序 但收到此错误 警告 格式 s 需要类型 char 但参数 2 的类型为 char 20 我在跑步Mac OS X v10 8 https en wikipedia org wiki OS X Mounta
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • SMTP 客户端在 C# 应用程序中显示错误“未采取请求的操作”

    我正在尝试使用 hotmail 帐户设置电子邮件发送应用程序 代码如下所示 MailMessage mail new MailMessage from to mail Subject Proba email mail Attachments
  • DbContext.SaveChangesAsync 异常处理

    当搭建新的脚手架时ApiController通过 Visual Studio 2013 中的异步操作和实体框架支持 某些方法可以包装DbContext SaveChangesAsync https msdn microsoft com en

随机推荐

  • 使用 Azure AD 多租户进行 Azure AD B2C 身份验证

    我已按照本文配置了 Azure AD 多租户身份验证 https learn microsoft com en us azure active directory b2c identity provider azure ad multi t
  • 如何刷新 iframe url?

    我正在使用 ionic 创建一个应用程序 其中使用 iframe 显示 URL 这是 HTML 代码 这是角度js scope iframeHeight window innerHeight document getElementById
  • 自适应卡 - 以字节为单位提供图像

    我正在尝试将图像放入 Bot 框架中的自适应卡中 如下所示 card Body Add new AdaptiveImage Type Image Url new Uri pictureUrl Size AdaptiveImageSize L
  • jQuery .val() 在更改选择框时返回未定义

    我有一个带有一些日期的选择框 我想在输入更改时获取所述日期的值 我的价值总是变得不确定 date pick change function var values date pick selected val alert values Fid
  • 在 C# 中直接在 DateTimePicker 上转到月份和年份

    如果用户在我的中输入日期 我该如何实现这一点DateTimePicker它会自动聚焦月份部分 输入该月份部分后 会转到年份部分 因为我不希望他必须按右键才能聚焦 有没有办法以编程方式执行此操作 用户不可能已经单击月份或年份部分 因为他使用键
  • 构建管道的默认分支。这是什么意思?

    在 Azure DevOps Services 的发布工作流程中 在设置持续部署触发器时 有一个选项 构建管道的默认分支 我不明白这意味着什么以及如何查看项目中不同管道的默认分支 任何有关这方面的文档的参考也会有所帮助 这也出现在管道中的其
  • 如何将 DataFrame 的列名从字符串转换为整数

    在下面的代码中 我将一个字符串读入 DataFrame 但即使输入字符串的标头是数字 它们也会作为字符串读入 1 2 有没有办法将它们作为数字读取 或者随后将它们转换为数字 import pandas as pd from StringIO
  • java初学者:如何在哈希图中对键进行排序?

    我是java新手 正在学习哈希图的概念 我很困惑哈希图中的键是如何排序的 我知道它基于字符串长度 但我很困惑当字符串长度相同时数据如何排序 import java util HashMap import java util Iterator
  • 如何向后读取文件以有效地查找子字符串

    我有一个巨大的这种结构的日志文件 时间戳 标识符 值 1463403600 AA 74 42 1463403601 AA 29 55 1463403603 AA 24 78 1463403604 AA 8 46 1463403605 AA
  • jQuery 组合框/自动完成但可编辑

    我正在使用 jQuery自动完成 http jqueryui com demos autocomplete combobox但我需要它是可编辑的 我的意思是 如果列表中没有某个值 我需要捕获他们输入的值 使用上面链接中的示例 用户可能看不到
  • 将本地分支从另一个本身经常重新基化的分支上进行 git rebase 是不是很糟糕?

    假设我有来自 origin master 的本地分支 A 我不断地对分支 A 进行更改 获取远程主服务器 并重新设置基准 然后我在 A 上建立了本地分支 B 我不断地对分支 B 进行更改并重新建立基础 我是唯一在 A 和 B 分支工作的人
  • 如何在 Django 中重写“get_queryset()”

    我将使用 django 中的通用视图 我定义了serializer class并重写了get queryset 方法 但是有一个错误告诉我重写get queryset 方法 我想知道我的覆盖方法是如何错误的 以及我必须做什么来解决该错误 这
  • 选择哪个数据库(Cassandra、MongoDB?)来存储和查询事件/日志/指标数据?

    用 SQL 术语来说 我们存储这样的数据 table events id timestamp dimension1 dimension2 dimension3 etc 所有维度值均为整数 这张桌子变得非常大 我们希望像这样的查询能够快速读取
  • Caffe的Python接口:“导入caffe”时出错

    我正在尝试在 Caffe 的 Python 界面中运行它 我已经运行了命令make pycaffe在 caffe 目录中并且运行良好 现在 当我运行命令时import caffe在终端的 python 环境中 Ubuntu 14 04 我收
  • 浏览网站时 cookie 如何工作

    在需要输入用户名和密码的网站上 我注意到我可以使用一个浏览器浏览该网站 并且无论我在网站上的哪个位置 它都会知道我是谁 但是 如果我打开不同的浏览器 除非我在该浏览器中登录 否则它不知道我在该浏览器中是谁 当我登录到某个网站后 它是否会在我
  • HtmlTable 和 TagBuilder("table") 之间的区别

    只是想知道这两者之间有什么区别 以及当我在 HtmlHelper 中构建表格时 其中一个或另一个有什么好处 HtmlTable table new HtmlTable and TagBuilder table new TagBuilder
  • 如何更改 Ant 表头复选框

    我的应用程序中有一个表 我在其中对每一行使用 select 当我单击并选择行时 左上角会出现一个选中的复选框 我不想显示该复选框 我想显示其他内容 例如带有文本的 div 仅当我单击一行中的复选框时 该 div 才会出现 这个怎么做 我试图
  • 使用共享代码分离前端和后端的 package.json

    我有一个项目 有一个单独的前端 webpack 和后端 express mongodb 我想分开 the package json同时即将在它们之间共享一些逻辑 实用代码 我如何组织我的文件结构 以便我可以适当地分离它们的依赖关系 现在这是
  • 从 edmx 模型生成 odata 类

    我正在尝试在另一个 ODATA API 的代码中使用来自现有 ODATA 端点的数据 我不想手动重新创建所有模型 因此我希望使用现有的 edmx 模型在 C 中创建我需要的类 我研究了 Microsoft 提供的 odata 客户端代码生成
  • 为此获得提升::shared_ptr

    我正在广泛使用boost shared ptr在我的代码中 事实上 大多数分配在堆上的对象都由一个shared ptr 不幸的是 这意味着我无法通过this进入任何需要一个函数shared ptr 考虑这段代码 void bar boost