懒汉模式通过局部静态变量实现线程安全且自动管理生命周期;2. 饿汉模式在程序启动时创建实例,天然线程安全但可能浪费资源;3. 带智能指针的懒汉模式结合unique_ptr与once_flag确保延迟加载和线程安全;4. 推荐优先使用局部静态变量的懒汉模式,简洁高效符合现代C++习惯。

单例模式确保一个类只有一个实例,并提供全局访问点。在C++中实现单例模式,关键在于控制构造函数的访问权限、禁止拷贝,并保证线程安全和资源释放。以下是几种常见且有效的实现方式。
懒汉模式(线程安全)
懒汉模式在第一次使用时才创建实例,适合启动较慢或可能不使用的场景。
- 使用静态局部变量,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;
};
饿汉模式(天然线程安全)
饿汉模式在程序启动时就创建实例,适用于确定会使用的场景。
立即学习“C++免费学习笔记(深入)”;
- 实例作为静态成员变量,在main执行前完成初始化
- 不存在多线程竞争问题
- 可能浪费资源,如果实例从未被使用
代码示例:
class Singleton {
public:
static Singleton& getInstance() {
return instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() = default;
~Singleton() = default;
static Singleton instance; // 程序启动时构造
};
// 定义静态成员
Singleton Singleton::instance;
带智能指针的懒汉模式(手动管理)
使用动态分配配合智能指针,延迟加载的同时避免内存泄漏。
- 用std::unique_ptr管理实例生命周期
- 配合互斥锁保证多线程安全
- 需要显式释放资源(RAII可简化)
代码示例:
#include基本上就这些。推荐优先使用**局部静态变量的懒汉模式**,简洁、线程安全、自动管理生命周期,符合现代C++习惯。#include class Singleton { public: static Singleton& getInstance() { std::call_once(initFlag, &Singleton::init); return *instance; } Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; private: Singleton() = default; ~Singleton() = default; static void init() { instance.reset(new Singleton); } static std::unique_ptr instance; static std::once_flag initFlag; }; std::unique_ptr Singleton::instance = nullptr; std::once_flag Singleton::initFlag;








