У меня уже есть некоторые классы одноэлементные, который использует указатели:Pitfall: Статическая переменная стека Singleton класс
class Logger
{
public:
static Logger* Instance()
{
if (!m_pInstance) m_pInstance = new Logger;
return m_pInstance;
}
private:
Logger();
Logger(Logger const&);
Logger& operator=(Logger const&);
static Logger* m_pInstance;
};
Но есть более простой способ, с помощью ссылки:
class Logger
{
public:
static Logger& Instance()
{
static Logger theLogger;
return theLogger;
}
private:
Logger();
Logger(Logger const&);
Logger& operator=(Logger const&);
~Logger();
};
Чтение статьи C++ Singleton design pattern , он предупреждает о втором способе:
[Potential Pitfall]: Эта форма синглтона может представлять проблему из-за продолжительности жизни объекта. Если один синглтон - , созданный в рамках другого, нужно быть в курсе последовательности вызовов деструктора .
Но я не могу это понять, может ли кто-нибудь показать мне плохое использование этого, что я должен его избегать?
Насколько я знаю, если компилятор включит вашу функцию (в данном случае экземпляр), и если вы включите заголовок в более чем один файл (в вашем случае это выглядит вероятным), у вас будет более одного экземпляра (насколько я запомнить). Конечно, я не уверен, правильно ли я помню, поэтому лучше обратиться к More Effective C++ от Scott Meyers. –
Проблема с обоими из вышеперечисленных событий - это то, что происходит, когда два потока одновременно называют экземпляр(). Компиляторы Pre C++ 11 иногда могли бы построить theLogger дважды. –
Нет, этого не произойдет. Это на самом деле называется Mayer 'Singleton и безопасно, как это может быть –