【问题标题】:C++ "this" shared_pointer safety in class method类方法中的 C++“this”shared_pointer 安全性
【发布时间】:2013-02-09 08:19:07
【问题描述】:

我有一个派生自 std::enable_shared_from_this 的类。所有类对象都由共享指针管理,因此当没有更多共享指针指向它们时,它们会自动销毁。

我有一个类方法,它从程序的数据结构中删除了一些共享指针,并且存在删除所有指向“this”的共享指针的风险,即调用类方法的对象。

问题是,如果真的所有指针都被删除了,是否有可能在方法运行时对象被销毁,并且“this”指针变得无效?如果我想确保它不会发生,我可以信任系统还是必须在方法内部创建一个 shared_ptr 到“this”,以保持对象处于活动状态,直到我完成它? (然后如果没有更多的指针,一旦方法执行结束就可以将其销毁)

示例:

class SharedObj : public std::enable_shared_from_this<SharedObj>
{
   /* ... */
    void do_something(SharedObj& a, SharedObj& b);
    std::shared_ptr<SharedObj> child;
};

void SharedObj::do_something(SharedObj& a, SharedObj &b)
{
   /* ... */
   a.remove_child();
   b.remove_child();
}

如果只有 a 和 b 有一个 shared_ptr 指向 "this",那么在两个 remove_child() 行之后,就没有指向 "this" 的共享指针,所以它应该被自动销毁

【问题讨论】:

  • @Mat 我添加了一个示例。该方法删除了子指针,然后我想安全地用“this”做更多的事情。

标签: c++ c++11 shared-ptr


【解决方案1】:

你当然可以通过做你正在做的事情从一个方法中破坏你的实例。但是这种情况并不特定于enable_shared_from_this,您总是可以在方法中调用一些可能导致您自己的类被破坏的东西。如果您在班级被销毁后尝试尊重this,这实际上只是一个错误。如果您继续使用不修改或访问类实例的常规代码,那么您是安全的。

如果您需要实例在整个函数执行期间保持不变,那么您的建议(在 do_something 执行期间将 shared_ptr 保存到您自己的实例中)是一个好主意。

【讨论】:

    【解决方案2】:

    如果您在整个过程中使用共享指针来管理生命周期,作为 Dave 的替代方案或补充,那么您应该只通过共享指针调用对象,以便指针保持对象活动直到函数返回.如果您存储指向共享指针托管对象的非拥有指针,那么您应该存储一个弱指针并在使用它之前锁定它。通过锁定创建的共享指针将再次使对象保持活动状态。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2021-07-12
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2014-03-07
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多