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.