исключение std :: bad_weak_ptr в shared_from_this после построения объекта - PullRequest
0 голосов
/ 06 сентября 2018

У меня определен класс, подобный следующему:

class A : std::enable_shared_from_this<A> {
public: 
  static std::shared_ptr<A> create() {
    return std::shared_ptr<A>(new A());
  }

  void f() { 
    shared_from_this();
  }

private:
  A() { }
};

и используется аналогично:

std::shared_ptr<A> pt = A::create();
pt->f();

Несмотря на то, что вызов shared_from_this () вызывается после создания shared_ptr pt, вызов f() по-прежнему приводит к возникновению исключения bad_weak_ptr. Запуск его в gdb подтверждает, что исключение выдается при вызове f(), а не в каком-то коде, который я здесь не включил и который вызывается инструктором.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Публичное наследование требуется здесь. Так как это класс А, значит, он не по умолчанию. Так же и причина увидеть исключение / bad_weak_ptr.

0 голосов
/ 06 сентября 2018

std::enable_shared_from_this<A> должно быть публичной базой. Когда конструктор shared_ptr видит, что вы унаследовали от enable_shared_from_this, он сохраняет слабую копию себя внутри объекта enable_shared_from_this. Если наследование не является общедоступным, это не может произойти, и weak_ptr, хранящийся в enable_shared_from_this, будет иметь значение null, что приведет к исключению bad_weak_ptr, когда shared_from_this позднее попытается создать из него shared_ptr.

...