c++ - shared_ptr - 从包含的对象中访问
问题描述
环境
- Ubuntu x64 操作系统
- C++
用例
SomeObj
是一个以多线程方式访问的类,并且只有在所有相关线程都关闭后才应进行清理SomeObj
正在控制其关联线程的生命周期- 在
SomeObj
所有关联线程正常终止之前进行破坏可能会在任何线程尝试访问被破坏的线程时导致“分段错误”SomeObj
- 为了避免这种情况,要管理一个 ref 计数,这样 obj 就不会被破坏,只要它的 ref 计数大于零,这样,每个线程在其生命周期内都持有一个 obj 的 ref,因此,只有当它的 ref 达到零时,obj 才会从内存中删除(自杀)。
- 这种方法保证 obj 只会在其所有关联线程终止后才会死亡,并且不需要等待的 obj(例如
std::mutex
)
考虑实施
- obj 生命周期是使用管理的
std::shared_ptr
std::shared_ptr
已经维护了对象的引用计数- 由
shared_ptr
外部代码维护 - 给定
std::shared_ptr<SomeObj>
,如果仅SomeObj
可以访问shared_ptr
引用计数,则它可以用于引用它的每个关联线程......或者,换句话说,如果SomeObj
可以std::shared_pt<this>
为每个关联线程保存一个。
手头的问题
给定std::shared_ptr<SomeObj>
, 可以访问由, 或持有SomeObj
的 ref 。?std::shared_ptr<SomeObj>
std::shared_ptr<this>
解决方案
改变 igel:
@NadavRub 你知道
std::enable_shared_from_this
吗?
纳达鲁布:
谢谢@alterigel,这正是我需要的。
推荐阅读
- amazon-web-services - 启用 VPC 时无法从 Lambda/Python/Boto3 连接到 S3
- java - 如何在 Java 中导入和导出原始图像?
- python - 基于正则表达式的自定义模板过滤器在字符串中找不到第一个目标词(Django 2.1)
- sql-server - SQL Server,创建一个以变量为参数的函数返回表
- javascript - 将 fetch 转换为在 jquery 中正确使用 $.ajax?
- java - 如何基于 CSV 标头创建/更新 Avro 架构
- xamarin.forms - Xamarin 窗体相机和画廊单击
- python - 使用python的pocketsphinx设置普通话/中文模型和字典问题
- javascript - 如何在处理到 Angular 7 中的下一步之前等待 http 请求获得响应
- python - 创建带有破折号的地图得到语法错误