Удаление синглтонов

Добрый вечер,
на работе возникла задача, правильно удалить синглтоны(их много более 40-50).
причем разных видов(статические и динамические).
Но проблема в том, что из-за их большого количества непонятно когда точно их можно удалять, а из-за того что они неправильно удаляются или вообще не удаляются, в конце работы приложения приложение редко но падает на удалении.

Вопрос: как это можно правильно организовать?
Сам думаю правильно реализовать методы Destroy() для удаления памяти за синглтоном и всем остальным, что выделено динамически.
Метод Terminate() для очистки листов и всяких объектов внутри.
Возможно, есть смысл иметь какой-то менеджер над ними, чтобы верно удалять…

Никто не сталкивался с подобной проблемой? Может быть кто-то сталкивался и обрисует идею или подскажет в каком направлении двигаться.

За любой пост спасибо.
  • Вопрос задан
  • 4200 просмотров
Решения вопроса 1
yse
@yse
Попробуйте покопать в направлении использовании функции atexit() — эта функция регистрирует пользовательские функции, которые вызываются при выходе из приложения. А вообще, если много синглтонов — посмотрите реализацию у Александреску в библиотеке Loki
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Mephi1984
@Mephi1984
Если при удалении возникает что-то наподобие static initialization order fiasco (из-за неопределенного порядка удаления синглтонов возникают ошибки), то можно поместить все синглтоны в один объект, как поля — тогда они будут удалятся в обратном порядке объявления.

Удобнее всего использовать RAII — выделять память в конструкторе, а удалять в деструкторе, тогда и Terminate не понадобится. Конечно это не всегда получается, но в-основном именно так.

Динамически выделяемую память лучше всего хранить в shared_ptr, он реализует RAII.
Ответ написан
isvirin
@isvirin
Каким образом Вы вообще организуете сборку мусора? Как определяется порядок удаления объектов?

Если Вы не используете умные указатели, то крайне рекомендую их использовать. Только при использовании внимательно отнеситесь к другой возможной проблеме — циклические ссылки, а то вообще ничего не будет удаляться;)

Что касается singleton-ов, то раздавайте их в виде умных указателей. Храните их все в одном реестре (как уже посоветовали выше), чтобы в момент удаления все их обнулить и отпустить, так сказать свободное плаванье. Они сами удалятся в правильном порядке за счет использования умных указателей.

Всякие Terminate (или Shutdown) нужны для того, чтобы разорвать возможные циклические ссылки, участниками которых является сам singleton.

Вообще, рекомендую при разработке хоть сколько-то сложных программ (40-50 singleton-ов это уже немало) использовать выделенную сущность kernel, которая при запуске создаст и инициализирует все экземпляры (особенно singleton-ы), а при удалении всех их «отпустит». Важно, что именно «отпустит», а не удалит, т.к. между в мало мальски сложной системе всегда возникают связи, которые простая логика «удаления в обратном порядке» не разорвет корректно. Подсчет ссылок Вам в руки.

Мы такой подход опробовали на весьма и весьма больших системах (тысячи объектов, сотни singleton-ов) — все корректно включается и выключается:)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы