Как правило, вам следует избегать побочных эффектов, таких как удаление указателя на объект в контейнере, если только контейнер не отвечает за создание указателя.
Проблемы указателей с шаблоном Observer запускаютнемного глубже, чем это.
Наблюдатель по своей природе имеет какую-то ссылку на Субъекта.Если эта ссылка является прямой ссылкой (например, не дескриптор), то, если этот объект выходит из области видимости или удаляется, когда наблюдатель выполняет вызов Notify (...), он генерирует исключение (или хуже).Таким образом, вы должны убедиться, что вы отсоединились (...) от наблюдателя при удалении субъекта.
Забыть это - проблема, поэтому мне нравится идея встроить ее в базовый класс виртуального деструктора.Это также означает, что Субъект имеет знания Обозревателя (ссылка на него), поэтому он может вызвать Detach (...).Что ставит вас в аналогичную ситуацию с Обозревателем (т.е. если он будет удален).Подход, который я нашел наиболее простым в использовании, заключается в том, чтобы Наблюдатель фактически являлся единичным объектом, в котором субъекты регистрировались для определенных уведомлений, а не просто «У меня есть состояние, которое вы хотите обновить».Это согласуется с пунктом 7 GoF, «Явное указание модификаций».Также, просто имеет смысл немного сузить поле обновлений.Это также позволяет подключать любую форму субъекта куда угодно.
Еще один случай, который необходимо рассмотреть, - это когда субъект удаляется во время итерации Notify (..).В вашем Observer у вас есть список субъектов, A, B и C. Вы меняете состояние и вызываете Notify (...) на A. A удаляет B. Теперь вы переходите к вызову Notify (...) на B, которого не существует.Если у вас есть это Detach (...) в деструкторе, B может больше не быть в списке.Но это может все же произойти, если вы решите перебирать копию Предметов, с которых вы начали, вместо фактического списка (был там, сделал это).По этой причине ваш наблюдатель должен обработать вызов Detach (...) во время итерации для уведомления (...).
У меня есть отработанный пример этого, опубликованный в блоге здесь .