gpt4 book ai didi

C++ "this"类方法中的 shared_pointer 安全

转载 作者:太空宇宙 更新时间:2023-11-04 16:23:14 25 4
gpt4 key购买 nike

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

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

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

示例:

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 有一个指向“this”的 shared_ptr,那么在两个 remove_child() 行之后,没有指向“this”的共享指针,所以基本上它应该被自动销毁

最佳答案

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

你的建议(在 do_something 的执行期间将 shared_ptr 保存到你自己的实例)是个好主意,如果你需要实例在整个函数执行。

关于C++ "this"类方法中的 shared_pointer 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com