1. 单例模式概述
单例模式是C++中最常用的设计模式之一,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要全局唯一对象的场景下非常有用,比如日志系统、配置管理、资源池等。
提示:单例模式虽然简单,但实现不当会导致线程安全、内存泄漏等问题,需要特别注意实现细节。
在实际项目中,我经常看到开发者对单例模式的理解存在误区。最常见的错误包括:
- 忽略线程安全性
- 忘记禁用拷贝构造函数和赋值运算符
- 不合理的初始化时机选择
- 内存管理不当
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单例模式的实现方式
2.1 局部静态变量式单例(C++11及以上)
这是我最推荐的现代C++单例实现方式,简洁、安全且高效。
cpp复制class Singleton {
private:
Singleton() { /* 初始化逻辑 */ }
~Singleton() { /* 清理逻辑 */ }
// 禁用拷贝和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
void doSomething() {
// 业务逻辑
}
};
2.1.1 技术要点解析
- 线程安全性:C++11标准保证局部静态变量的初始化是线程安全的
- 延迟初始化:实例在第一次调用getInstance()时才被创建
- 自动析构:程序退出时会自动调用析构函数
- 内存管理:无需手动管理内存,避免内存泄漏
我在实际项目中使用这种实现方式时,发现它有几个明显的优势:
- 代码简洁,不易出错
- 完全避免了手动内存管理的麻烦
- 线程安全性由语言标准保证,无需额外处理
2.2 传统单例模式实现
2.2.1 饿汉式单例
cpp复制class Singleton {
private:
Singleton() {}
static Singleton instance;
public:
static Singleton& getInstance() {
return instance;
}
};
// 类外初始化
Singleton Singleton::instance;
优缺点分析:
- 优点:实现简单,线程安全
- 缺点:无论是否使用都会创建实例,可能造成资源浪费
2.2.2 懒汉式单例
cpp复制class Singleton {
private:
Singleton() {}
static Singleton* instance;
public:
static Singleton& getInstance() {
if (!instance) {
instance = new Singleton();
}
return *
