C++如何实现单例模式?(代码示例)

C++11局部静态变量实现单例最推荐——利用其线程安全、延迟初始化特性,代码简洁且无需手动管理内存;饿汉式启动即构造但不支持延迟初始化;手动指针方式需自行处理线程安全与释放。

单例模式确保一个类只有一个实例,并提供全局访问点。C++ 中常用 懒汉式(线程安全)饿汉式 两种实现,现代 C++(C++11 起)推荐用局部静态变量方式——简洁、线程安全、延迟初始化。

✅ 推荐写法:C++11 局部静态变量(最简且安全)

利用 C++11 标准中“函数内局部静态变量的初始化是线程安全的”特性:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // ✅ 延迟初始化 + 线程安全
        return instance;
    }
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

private: Singleton() = default; // 私有构造,禁止外部创建 ~Singleton() = default; // 可选:若需自定义析构可设为 public/protected };

使用方式:

int main() {
    auto& s1 = Singleton::getInstance();
    auto& s2 = Singleton::getInstance();
    // s1 和 s2 是同一个对象(地址相同)
    return 0;
}

⚠️ 注意事项:避免常见坑

  • 不要在构造函数里调用 getInstance(),否则导致无限递归或未定义行为
  • 静态局部变量的析构时机由首次调用时的线程决定,但销毁本身是线程安全的(C++11 起)
  • 若单例依赖其他全局对象,注意静态初始化顺序问题;可考虑用指针 + new(手动管理),但需额外处理释放逻辑

? 饿汉式(适合无复杂初始化、要求绝对启动即存在)

全局静态对象,程序启动时即构造,天然线程安全,但不支持延迟初始化:

class Singleton {
public:
    static Singleton& getInstance() {
        return instance;
    }
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

private: Singleton() = default; static Singleton instance; // 全局唯一实例 };

// 定义静态成员(必须在 .cpp 文件中) Singleton Singleton::instance;

? 手动管理指针(兼容老标准,但需谨慎)

适用于需控制销毁时机或 C++98 环境(不推荐新项目使用):

class Singleton {
public:
    static Singleton* getInstance() {
        if (!instance) {
            instance = new Singleton();
        }
        return instance;
    }
static void destroy() {
    delete instance;
    instance = nullptr;
}

private: Singleton() = default; static Singleton* instance; };

Singleton* Singleton::instance = nullptr;

⚠️ 缺点:需手动调用 destroy(),否则内存泄漏;多线程下 getInstance() 非线程安全(需加锁)。

基本上就这些。C++11 的局部静态变量方案最值得优先采用——不用锁、不担心析构顺序、代码干净、语义清晰。