Я предпочитаю разрешить синглтон, но не применять его, чтобы никогда не скрывать конструкторы и деструкторы. Это уже было сказано, просто поддерживая меня.
Мой поворот заключается в том, что я редко использую статическую функцию-член, если я не хочу создать настоящий синглтон и скрыть constr. Мой обычный подход таков:
template< typename T >
T& singleton( void )
{
static char buffer[sizeof(T)];
static T* single = new(buffer)T;
return *single;
}
Foo& instance = singleton<Foo>();
Почему бы не использовать статический экземпляр T вместо размещения new? Статический экземпляр дает гарантии порядка строительства, но не порядок уничтожения. Большинство объектов уничтожаются в обратном порядке построения, но статические и глобальные переменные. Если вы используете статическую версию экземпляра, вы в конечном итоге получите загадочные / прерывистые ошибки сегмента и т. Д. После окончания main.
Это означает, что деструктор синглетонов никогда не будет вызван. Тем не менее, процесс в любом случае идет вниз, и ресурсы будут восстановлены. К этому сложно привыкнуть, но, поверьте мне, на данный момент нет лучшего кроссплатформенного решения. К счастью, в C ++ 0x внесены изменения, чтобы гарантировать порядок уничтожения, который решит эту проблему. Как только ваш компилятор поддерживает новый стандарт, просто обновите функцию singleton, чтобы использовать статический экземпляр.
Кроме того, я в реальной реализации использую boost, чтобы получить выровненную память вместо простого символьного массива, но не хотел усложнять пример