Подтвердить что ты не робот

Enable_shared_from_this - пустой внутренний слабый указатель?

Я использую enable_shared_from_this<Base>, а затем наследую от Base. При попытке использовать конструктор shared_from_this() в Derived (не список инициализаторов) я получаю исключение. Оказывается, что внутренний слабый указатель имеет значение null и вообще не указывает на this. Как это может произойти? Мой другой пример использования именно этого прекрасно работает. Я даже не знаю, с чего начать. Я посмотрел на исходный код enable_shared_from_this, и мне кажется, что этот указатель всегда будет иметь значение nullptr.

4b9b3361

Ответ 1

Вы не можете вызвать shared_from_this() в конструкторе объекта. shared_from_this() требует, чтобы объект принадлежал хотя бы одному shared_ptr. Объект не может принадлежать shared_ptr до его создания.

Я бы предположил, что внутренний слабый указатель установлен, когда a shared_ptr впервые переходит в собственность объекта. До этого момента нет ссылочной структуры счета, которую может ссылаться на слабый указатель.

Ответ 2

Ответ Джеймса Макнеллиса прав.

Что касается объяснения самого шаблона enable_shared_from_this, который, как вы видите, ничего не делает, обратите внимание на 7 внизу на этой странице объясняет:

... шаблон enable_shared_from_this содержит weak_ptr объект, который указывает на производный объект. Там есть проблема с курицей и яйцом, однако, о как инициализировать этот объект weak_ptrкогда нет соответствующих shared_ptr объект. Реализация трюк заключается в том, что конструкторы для shared_ptr знать о enable_shared_from_this и установите weak_ptr объект во время строительства a shared_ptr объект, которому принадлежит ресурс, который enable_shared_from_this как публичный базовый класс.

Ответ 3

Концептуально shared_from_this() выбирает shared_ptr, указывающий на this и возвращает его копию.

В конструкторе нет shared_ptr, указывающего на this.