shared_from_this() 在特定情况下崩溃

shared_from_this() crashes in specific case

提问人:Notrum666 提问时间:10/24/2022 更新时间:10/24/2022 访问量:87

问:

选项 1 使用bad_weak_ptr使应用程序崩溃,而选项 2 工作正常,为什么?我看到的唯一区别是克隆的创建位置 - 在函数中或与为克隆创建一致,在这两种情况下,都满足了已经拥有使用时所有权的要求shared_from_this()Clone()shared_ptrshared_from_thisshared_ptrthisshared_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;
}
C++ 这个 shared-ptr

评论

0赞 thedemons 10/24/2022
您应该改用std::make_shared<Derived>(...)

答:

1赞 selbie 10/24/2022 #1

你不能派生自该对象并使其安全工作,因为该对象实际上没有shared_ptr容器。newenable_shared_from_thisnew

取而代之的是:

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 Derivedshared_from_this()shared_ptrshared_ptr<Derived>shared_ptr<Base>