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

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

C++如何实现单例模式?(代码示例)-第1张图片-佛山资讯网

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

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

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

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // ✅ 延迟初始化 + 线程安全
        return instance;
    }
<pre class='brush:php;toolbar:false;'>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(手动管理),但需额外处理释放逻辑

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

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

立即学习“C++免费学习笔记(深入)”;

标签: ai c++

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~