shared_from_this
можно вызвать, только если this
уже управляется другим std::shared_ptr
.Поскольку вы вызываете его из конструктора J
, мы можем проверить, что это не так.
со страницы shared_from_this
на cppreference.com :
Разрешается вызывать shared_from_this только для ранее общего объекта, то есть для объекта, управляемого std::shared_ptr
.В противном случае поведение не определено (до C ++ 17) std::bad_weak_ptr
генерируется (конструктором shared_ptr
из построенного по умолчанию weak_this
) (начиная с C ++ 17).
Начиная с C ++ 17, ваш код будет ломаться более отчетливо.
Код
#include <memory>
#include <utility>
struct J : std::enable_shared_from_this<J>
{
J() {
std::ignore = shared_from_this();
}
};
int main()
{
std::ignore = std::make_shared<J>();
}
Компиляция и запуск
g++ -std=c++17 -Wall -Wextra -pedantic -Werror -O3 main.cpp && ./a.out
Вывод
terminate called after throwing an instance of 'std::bad_weak_ptr'
what(): bad_weak_ptr
bash: line 7: 28216 Aborted (core dumped) ./a.out
До C ++ 17 ваш код имел неопределенное поведение.Я могу только догадываться, что это проявляется в случайном / странном поведении.
Могу поспорить, вы хотите что-то более простое:
#include <memory>
struct J
{
static std::weak_ptr<J> r() { return _auto_manager; }
private:
static std::shared_ptr<J> _auto_manager;
};
std::shared_ptr<J> J::_auto_manager = std::make_shared<J>();
int main()
{
auto p = J::r();
}