0

我有一个派生自 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”的共享指针,所以它应该被自动销毁

4

2 回答 2

3

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

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

于 2013-02-09T08:48:22.610 回答
2

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

于 2013-02-10T13:21:25.107 回答