单例模式通过私有构造函数、禁用拷贝和赋值,确保类唯一实例并提供全局访问点。饿汉式在程序启动时创建实例,线程安全,适用于对启动时间不敏感的场景,通过类外定义静态成员实现。懒汉式在首次调用时初始化,节省资源,但需处理线程安全问题。C++11后推荐使用局部静态变量的Meyer's Singleton,延迟初始化且自动线程安全。对于需精细控制生命周期或兼容旧标准的情况,可采用std::unique_ptr配合std::mutex实现带锁的懒汉式,避免内存泄漏。选择方式应根据项目需求和C++标准支持决定,现代C++中Meyer's Singleton为首选方案。

单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式,关键在于控制构造函数的访问权限、禁止拷贝和赋值,并保证线程安全的实例创建。
饿汉式(Eager Initialization)
饿汉式在程序启动时就创建实例,天然线程安全,适用于对启动时间不敏感的场景。实现方式:静态成员变量在类外定义并初始化,对象在加载时即被构造。
示例代码:
class Singleton {
private:
static Singleton instance; // 静态实例
Singleton() = default; // 私有构造函数
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton& getInstance() {
return instance;
}
void doSomething() {
// 示例方法
}};
立即学习“C++免费学习笔记(深入)”;
// 类外定义静态成员
Singleton Singleton::instance;
懒汉式(Lazy Initialization) + 双重检查锁定
懒汉式在第一次调用时才创建实例,节省资源,但需处理多线程并发问题。C++11以后,使用局部静态变量可实现“Meyer's Singleton”,简洁且线程安全。
推荐写法(基于C++11局部静态):
class Singleton {
private:
Singleton() = default;
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton& getInstance() {
static Singleton instance; // 局部静态变量,延迟初始化,线程安全
return instance;
}
void doSomething() {
// 示例方法
}};
带智能指针的懒汉式(手动管理)
若需要更精细控制生命周期或兼容旧标准,可用std::unique_ptr配合互斥锁实现。注意:需确保析构顺序安全,避免静态析构问题。
#include
#include
class Singleton {
private:
static std::unique_ptr instance;
static std::mutex mtx;
Singleton() = default;
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton* getInstance() {
std::lock_guard lock(mtx);
if (!instance) {
instance = std::unique_ptr(new Singleton);
}
return instance.get();
} };
立即学习“C++免费学习笔记(深入)”;
// 类外定义
std::unique_ptr Singleton::instance = nullptr;
std::mutex Singleton::mtx;
关键要点总结
- 私有化构造函数、拷贝构造和赋值操作符,防止外部创建多个实例
- 使用static局部变量是C++11后最简洁安全的方式
- 饿汉式适合简单场景,懒汉式适合资源敏感型应用
- 多线程环境下必须保证初始化过程的线程安全
- 避免动态分配带来的内存泄漏风险,优先使用栈上静态对象
基本上就这些。选择哪种方式取决于项目需求和C++标准支持情况。Meyer's Singleton 是现代C++中最常用也最推荐的做法。











