提问人:Notrum666 提问时间:10/24/2022 更新时间:10/24/2022 访问量:87
shared_from_this() 在特定情况下崩溃
shared_from_this() crashes in specific case
问:
选项 1 使用bad_weak_ptr使应用程序崩溃,而选项 2 工作正常,为什么?我看到的唯一区别是克隆的创建位置 - 在函数中或与为克隆创建一致,在这两种情况下,都满足了已经拥有使用时所有权的要求shared_from_this()
Clone()
shared_ptr
shared_from_this
shared_ptr
this
shared_from_this()
class Base
{
public:
virtual Base* Clone() = 0;
};
class Derived : public Base, public std::enable_shared_from_this<Derived>
{
public:
Base* Clone() override
{
return new Derived(*this);
}
void test()
{
std::shared_ptr<Derived> ptr = shared_from_this();
}
};
int main()
{
std::shared_ptr<Base> obj = std::make_shared<Derived>();
//std::shared_ptr<Base> clone = std::shared_ptr<Base>(obj->Clone()); // option 1
std::shared_ptr<Base> clone = std::shared_ptr<Base>(new Derived(*std::static_pointer_cast<Derived>(obj))); // option 2
std::shared_ptr<Derived> derived = std::static_pointer_cast<Derived>(clone);
derived->test();
return 0;
}
答:
1赞
selbie
10/24/2022
#1
你不能派生自该对象并使其安全工作,因为该对象实际上没有shared_ptr容器。new
enable_shared_from_this
new
取而代之的是:
Base* Clone() override
{
return new Derived(*this);
}
这:
shared_ptr<Base> Clone() override
{
return make_shared<Derived>(*this);
}
基类声明中的类似调整:
virtual shared_ptr<Base> Clone() = 0;
评论
0赞
Notrum666
10/24/2022
这是唯一的办法吗?我没有必要保留克隆函数的原始指针返回值,但如果可能的话,我想保留它
2赞
j6t
10/24/2022
问题不在于不应该使用,而在于要使工作,那么第一次将新对象存储在 中时,那必须是 ,而不是 。new Derived
shared_from_this()
shared_ptr
shared_ptr<Derived>
shared_ptr<Base>
评论
std::make_shared<Derived>(...)