单例模式确保类唯一实例并提供全局访问点,常见实现包括懒汉模式(首次调用创建,需注意线程安全)、线程安全的局部静态变量版本(C++11推荐)、饿汉模式(程序启动即初始化,线程安全但可能浪费资源)以及结合析构结构体或智能指针的自动资源管理方式,选择依据为是否延迟加载、多线程环境和资源释放需求。

单例设计模式确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式,主要关注构造函数私有化、静态实例和全局访问方法。以下是几种常见且实用的实现方式。
1. 懒汉模式(Lazy Initialization)
懒汉模式在第一次调用时才创建实例,适合实例使用频率低或初始化开销大的场景。
关键步骤:
- 将构造函数、拷贝构造函数和赋值操作符设为私有,防止外部创建多个实例
- 定义一个静态指针成员指向唯一实例
- 提供静态成员函数获取实例
示例代码:
class Singleton { private: static Singleton* instance; Singleton() {} // 构造函数私有 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; <p>public: static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; } };</p><p>// 静态成员定义 Singleton* Singleton::instance = nullptr;
注意:此版本不是线程安全的。多线程环境下需加锁。
立即学习“C++免费学习笔记(深入)”;
2. 线程安全的懒汉模式
在多线程程序中,需保证getInstance的安全性。
使用C++11以后的静态局部变量特性可轻松实现线程安全。
改进版代码:
class Singleton { private: Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; <p>public: static Singleton& getInstance() { static Singleton instance; // 局部静态变量,C++11保证线程安全 return instance; } };
这个版本简洁且高效,推荐在现代C++中使用。
3. 饿汉模式(Eager Initialization)
饿汉模式在程序启动时就创建实例,避免运行时判断和创建开销。
适用于确定一定会使用的对象。
实现方式:
class Singleton { private: static Singleton instance; Singleton() {} <p>public: static Singleton& getInstance() { return instance; } };</p><p>// 程序启动时即初始化 Singleton Singleton::instance;
优点是简单、线程安全;缺点是可能浪费资源,如果实例从未被使用。
4. 自动释放资源的单例
为避免内存泄漏,可借助局部静态对象的析构机制自动清理。
或者使用智能指针配合自定义删除器。
示例(利用静态变量生命周期):
class Singleton { private: Singleton() {} ~Singleton() {} <p>public: static Singleton& getInstance() { static Singleton instance; static struct Destructor { ~Destructor() { // 可添加日志或清理逻辑 } } destroyer; return instance; } };
基本上就这些。选择哪种方式取决于具体需求:是否需要延迟加载、是否多线程、是否要求自动释放等。


