在谷歌的帮助下,我做了一个单例日志记录类:
class Log{
public:
void Initialize(const char* fileName, int logLevel, ...);
void outString(const char* str, ...);
void outError(const char* str, ...);
void outWarning(const char* str, ...);
static Log* GetInstance()
{
if (!m_instance)
m_instance = new Log();
return m_instance;
}
private:
Log() {}
Log(const Log&);
Log& operator=(const Log&);
private:
static Log *m_instance;
void SetColor(bool stdout_stream, Color color);
string getCurrentTime();
void ResetColor(bool stdout_stream);
int m_logLevel;
ofstream *m_file;
};
现在我想知道这里的 * 是什么:static Log *m_instance;为什么我们将它设置为指针?我真的不明白。我的意思是,它将指向什么?
最佳答案
它是一个指针,因此它最初可以为空;然后指向在第一次访问时使用 new
创建的实例;请参阅 GetInstance
函数。
这是 Singleton 反模式的“惰性泄漏”变体:实例在首次访问时创建,并且永远不会销毁。与所有用 C++ 实现单例的尝试一样,它有一些优点:
- 无论何时被访问,实例都保证存在;
- 如果实例从未被访问过,它不会占用任何内存(指针除外)
还有一些不好的地方:
- 实例永远不会被销毁,因此可能会被报告为内存泄漏;
- 在每次访问时检查指针的(可能很小的)成本;
- 创建不是线程安全的,并且在每次访问时不产生(可能是主要的)成本的情况下使其线程安全并非易事。
关于c++ - 单例模式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514416/