Синглтон Деструкторы - PullRequest
27 голосов
/ 08 ноября 2008

Должны ли объекты Singleton, которые не используют счетчики экземпляров / ссылок, считаться утечками памяти в C ++?

Без счетчика, который вызывает явное удаление экземпляра синглтона, когда счетчик равен нулю, как объект удаляется? Очищается ли она ОС после завершения работы приложения? Что если этот синглтон выделил память в куче?

В двух словах, должен ли я вызывать деструктор Сингелтона или я могу рассчитывать на его очистку после завершения работы приложения?

Ответы [ 12 ]

0 голосов
/ 21 сентября 2018

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

Singleton &get_singleton() {
   static Singleton singleton;
   return singleton;
}

Я думаю

Singleton &get_singleton() {
   static std::shared_ptr<Singleton> singleton = std::make_shared<Singleton>();
   static thread_local std::shared_ptr<Singleton> local = singleton;
   return *local;
}

поэтому, когда основной поток выходит и берет с собой singleton, каждый поток по-прежнему имеет свой собственный local shared_ptr, который поддерживает один Singleton в живых.

0 голосов
/ 08 ноября 2008

Любая кучная память, выделенная вашим процессом и не освобожденная (удаленная), будет возвращена ОС. Если вы используете наиболее распространенную реализацию синглтона, которая использует статические переменные, это также будет устранено после завершения работы вашего приложения.

* Это не означает, что вы должны обходить новые указатели и никогда не чистить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...