Базовый класс CRTP наследует std :: enable_shared_from_this, выбрасывая std :: bad_weak_ptr. Мне нужно учение - PullRequest
0 голосов
/ 07 января 2019

Когда я пытаюсь share_from_this() в базовом классе shared_handler вернуть общий указатель DerivedT, я получаю исключение: std::bad_weak_ptr

Я пытался сохранить внутренний разделяемый указатель в базовом классе во время конструирования, прежде чем вызывать shared_from_this(), но я получаю еще более неоднозначную ошибку.

template<class DerivedT>
struct shared_handler : std::enable_shared_from_this<DerivedT>
{
  void some_method(arbitrary input) {
    do_something(shared_from_this());
  }
};

struct my_handler : shared_handler<my_handler>
{
  my_handler()
  {
    some_method("hello");
  }
};

1 Ответ

0 голосов
/ 07 января 2019
template<class DerivedT>
struct shared_handler : std::enable_shared_from_this<shared_handler<DerivedT>>
{
  void some_method(arbitrary input) {
    do_something(shared_from_this());
  }
};

От cppreference :

Разрешено вызывать shared_from_this только для ранее общего объекта, то есть для объекта, управляемого std::shared_ptr<T>. В противном случае std::bad_weak_ptr генерируется (конструктором shared_ptr из построенного по умолчанию weak_this).

До C ++ 17 это было неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...