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