C++单例模式
时间: 2025-04-27 20:28:31 浏览: 22
### C++ 单例设计模式的实现与使用
#### 实现线程安全的懒汉式单例模式
为了确保实例仅被创建一次并提供全局访问点,在C++中可以通过静态成员函数来控制类对象的创建过程。下面展示了一种常见的懒加载方式,即当第一次调用 `getInstance` 方法时才初始化该类的对象[^1]。
```cpp
class Singleton {
private:
static std::unique_ptr<Singleton> instance;
// 私有化构造函数防止外部new
Singleton() {}
public:
~Singleton() {}
// 删除拷贝构造和赋值操作符以阻止复制行为
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 获取唯一实例的方法, 使用双重检测锁机制保证多线程环境下的安全性
static Singleton* getInstance() {
if (instance.get() == nullptr) { // 第一层判断减少竞争开销
std::lock_guard<std::mutex> lock(mutex_);
if (!instance) { // 双重检查锁定
instance.reset(new Singleton());
}
}
return instance.get();
}
private:
static std::once_flag initFlag; // 初始化标志位
static std::mutex mutex_; // 同步互斥量用于保护临界区
};
std::unique_ptr<Singleton> Singleton::instance(nullptr);
std::once_flag Singleton::initFlag;
std::mutex Singleton::mutex_;
```
这种方法不仅实现了延迟加载(Lazy Initialization),还通过双层校验加锁的方式提高了并发性能,适用于高并发场景下资源的竞争管理[^2]。
#### 饿汉式单例模式
如果应用程序启动之初就需要立即获取到这个唯一的实例,则可以采用饿汉式的写法。这种方式非常简单直观,因为实例是在定义的时候就被创建出来的,所以不存在任何同步问题[^3]。
```cpp
class Singleton {
private:
// 构造器私有化
Singleton() {};
public:
// 禁止拷贝
Singleton(Singleton const&) = delete;
void operator=(Singleton const&) = delete;
// 提供全局访问接口
static Singleton& GetInstance(){
static Singleton instanse;
return instanse;
}
};
// 客户端代码可以直接这样获得单例对象:
void someFunction(){
auto &singletonObj = Singleton::GetInstance();
}
```
此版本利用了局部静态变量特性——它们会在首次执行所在语句之前完成初始化工作,并且整个程序生命周期内只做这一次初始化动作[^4]。
#### 应用场合说明
对于大多数情况而言,推荐优先考虑基于局部静态变量特性的饿汉式方案,除非确实存在明显的按需分配需求或者担心编译期就占用过多内存空间等问题才会转向更复杂的懒加载形式[^5]。
阅读全文
相关推荐















