Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Удаление синглтонов


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

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

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

За любой пост спасибо.

Автор: Result 11.4.2013, 21:48
Цитата(toxx @ 11.4.2013,  19:23)
Никто не сталкивался с подобной проблемой? Может быть кто-то сталкивался и обрисует идею или подскажет в каком направлении двигаться.

За любой пост спасибо.

Александреску сталкивался  smile в манускрипте "Современное проектирование на С++" повествуется о нескольких подходах к решению этой пичальки 

Автор: toxx 11.4.2013, 22:28
Хм, как столь интересная книга ушла от моего глаза, понять не могу, спасибо=)

Автор: borisbn 12.4.2013, 06:21
> За любой пост спасибо.
За любой, так за любой...

Синглтоны - зло. Не используй их вообще.
Кстати, я когда прочитал заголовок, решил что вопрос об избавлении от синглтонов ))

Автор: toxx 12.4.2013, 09:48
borisbn
Нужно было написать приписку(Кроме постов сиглтоны зло)  smile 

Автор: Alca 12.4.2013, 11:14
Цитата

Сам думаю правильно реализовать методы Destroy() для удаления памяти за синглтоном и всем остальным, что выделено динамически.
и метод Terminate() для очистки листов и всяких объектов внутри.

Я так и делал.

Добавлено через 1 минуту и 30 секунд
Цитата

Синглтоны - зло. Не используй их вообще.

Почему это вдруг, если нужен только один экземпляр класса?

Автор: toxx 12.4.2013, 13:07
Result, Книга полезная.

 smile 
Не буду разжигать холивар, но синглтоны полезны, но думаю если использовать их с умом. согласен поэтому с Alca
А так как сделаны у нас... они неконтролируемы и их много.

Автор: borisbn 12.4.2013, 14:06
Цитата(Alca @  12.4.2013,  11:14 Найти цитируемый пост)
Почему это вдруг, если нужен только один экземпляр класса? 

1. Зависимость от синглтона не видна в контракте твоего класса - твой класс неудобно рефакторить
2. Проблемы с удалением: удалять (вызывать Destroy()) нужно гарантировано после того, как все, кто с ним работает, перестали его вызывать, иначе получится воскрешение мёртвых
3. Лишний вызов функции - мелочь, конечно, но всё-таки
4. В случае (пусть даже и архи-редком), когда всё-таки потребуется иметь два экземпляра класса, рефакторинг будет ооооч. неприятный
5. Для тестирования частенько нужно подменять реальный объект фейковым (или с другим функционалом). В случае с синглтоном придётся менять сам синглтон.

У меня была такая проблема: в одной программе я для хранения настроек использовал синглтон Config. Как-то меня попросили сделать из программы dll, экспортирующую класс с определённым интерфейсом, для вставки в другую программу. Я сделал, а оказалось, что они хотели создавать 2 экземпляра моего класса. Получилась каша с настройками и пришлось переделывать. Были и ещё примеры (я раньше много грешил с синглтонами)  smile 

Автор: Result 12.4.2013, 14:55
Цитата(borisbn @ 12.4.2013,  14:06)
5. Для тестирования частенько нужно подменять реальный объект фейковым (или с другим функционалом). В случае с синглтоном придётся менять сам синглтон.

Насколько помню ,в либе Loki реализован паттерн синглтон на темплейтах, т.е. ничего менять не нужно.

Автор: toxx 13.4.2013, 21:10
Result
Так оно и есть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)