`shared_ptr`-从“包含”对象中访问

时间:2019-06-03 17:26:27

标签: c++

环境

  • Ubuntu x64操作系统
  • C ++

用例

  • SomeObj是一个以多线程方式访问的类,并且只有在其所有关联的线程都关闭后才应该清除
  • SomeObj正在控制其关联线程的生命周期
  • 在所有关联线程正常终止之前,SomeObj被破坏可能会在任何线程试图访问被破坏的SomeObj时导致“分段错误”
  • 为避免这种情况,应管理一个ref-count,以使obj不会被破坏,只要它的ref计数大于零即可。这样,每个线程在其生命周期内都会保留对obj的ref ,因此,只有当ref达到零时,才会将obj从内存中删除(自杀)。
  • 这种方法可确保obj仅在其所有关联线程终止后才会消失,并且这样做不需要等待obj(例如std::mutex

已考虑实施

  • 使用std::shared_ptr
  • 管理obj的生存期
  • std::shared_ptr已经维护了该对象的引用计数
  • shared_ptr由外部代码维护
  • 给出std::shared_ptr<SomeObj>,如果只有SomeObj可以访问shared_ptr引用计数,则可以将其用于引用每个与之相关的线程...换句话说,如果SomeObj可能为其每个关联线程拥有一个std::shared_pt<this>

眼前的问题

给出std::shared_ptr<SomeObj>,可以SomeObj访问std::shared_ptr<SomeObj>维护的引用,或者保存一个。 std::shared_ptr<this> ??

1 个答案:

答案 0 :(得分:1)

改变伊格尔:

@NadavRub您知道std::enable_shared_from_this吗?

NadavRub:

感谢@alterigel,这正是我所需要的。