c++ - 单例模式解释

标签 c++ singleton

在谷歌的帮助下,我做了一个单例日志记录类:

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/

相关文章:

vb.net - 以另一种形式访问类的同一实例

objective-c - 单例模式实现

c++ - 解析的一些技巧

c++ - 为什么我的字符串分配会导致段错误?

c++ - 使用 boost 的 async_write 的异步 tcp 服务器会导致错误的文件描述符

c++ - 为什么要在 C 和 C++ 项目中创建包含/目录?

Java单例用法

c++ - Boost python,暴露迈耶斯单例

php - PHP 中的 Singleton 类的新实例用于每个 HTTP 请求

c++ - 遍历类型列表