Тривиальные случаи сбоя shared_ptr и weak_ptr

У меня проблемы с использованием shared_ptr и weak_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 приводят к сбою программы. Я, должно быть, упускаю что-то очевидное - что это?

24
задан curiousguy 17 July 2019 в 00:24
поделиться

1 ответ

Вы должны наследовать публично от std::enable_shared_from_this. Наследование в частном порядке не помогает - std::shared_ptr не может получить доступ к базовому классу и правильно его настроить.

31
ответ дан Igor Tandetnik 17 July 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: