32

我在使用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都会使程序崩溃。我一定遗漏了一些明显的东西——它是什么?

4

2 回答 2

41

您必须. std::enable_shared_from_this私下继承没有帮助 -std::shared_ptr无法访问基类并正确设置它。

于 2019-07-16T19:38:26.177 回答
17

您必须公开继承std::enable_shared_from_this才能使其正常工作。

于 2019-07-16T19:38:38.580 回答