shared_ptr和weak_ptr的琐碎情况失败

时间:2019-07-16 19:33:13

标签: c++ shared-ptr weak-ptr private-inheritance enable-shared-from-this

我在使用shared_ptrweak_ptr以及enable_shared_from_this时遇到麻烦。

当我查看自己所看到的症状时,每个人都建议“当没有shared_from_this()个实例拥有您的对象时,您不能使用shared_ptr

但这不是我的情况。

考虑以下代码:

#include <memory>
#include <cassert>

class MyClass : std::enable_shared_from_this<MyClass>
{
public:
    void this_fails()
    {
        // Doesn't even assert(), because it throws bad_weak_ptr
        assert(shared_from_this());
    }
    void this_fails_too()
    {
        std::weak_ptr<MyClass> weak = weak_from_this();
        std::shared_ptr<MyClass> strong = weak.lock();
        // This assert fails
        assert(strong.get());
    }
};

int main()
{
    std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();

    obj->this_fails();
    obj->this_fails_too();
}

MyClass中的两个方法都会使程序崩溃。我肯定想念一些明显的东西-这是什么?

2 个答案:

答案 0 :(得分:31)

您必须从std::enable_shared_from_this公开 。私有继承无济于事-std::shared_ptr无法访问基类并正确设置它。

答案 1 :(得分:15)

您必须公开继承自std::enable_shared_from_this才能起作用。