c++ - Casos triviais de shared_ptr e weak_ptr falhando




shared-ptr weak-ptr (2)

Estou tendo problemas ao usar shared_ptr e weak_ptr junto com enable_shared_from_this .

Quando eu google os sintomas do que estou vendo, todo mundo sugere "você não pode usar shared_from_this() quando não há instâncias shared_ptr possuindo seu objeto.

Mas esse não é meu caso.

Considere este código:

#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();
}

Ambos os métodos no MyClass o programa. Eu devo estar perdendo algo óbvio - o que é isso?


Você deve herdar publicamente de std::enable_shared_from_this . Herdar em particular não ajuda - std::shared_ptr não pode acessar a classe base e configurá-la corretamente.


Você tem que herdar publicamente de std::enable_shared_from_this para que funcione.





enable-shared-from-this