单例模式确保类唯一实例并提供全局访问点,C++中常用懒汉、饿汉和局部静态变量三种实现方式。1. 懒汉模式延迟初始化但需加锁保证线程安全;2. 饿汉模式程序启动即创建实例,线程安全但可能浪费资源;3. 局部静态变量法自C++11起线程安全,代码简洁且支持延迟初始化,为推荐写法。使用时需注意构造函数不调用虚函数、避免继承、合理管理生命周期及析构顺序问题,建议优先采用局部静态变量实现。

单例模式是一种常用的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式需要注意线程安全、构造顺序和资源释放等问题。下面介绍几种常见的实现方式。
懒汉模式(Lazy Initialization)
懒汉模式在第一次使用时才创建实例,适合初始化开销较大的情况。
// 基础懒汉模式(非线程安全)class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
这种方式在多线程环境下可能创建多个实例,因此需要加锁保证线程安全。
// 线程安全的懒汉模式(使用互斥锁)#include
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}
public:
static Singleton* getInstance() {
std::lock_guard<:mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
饿汉模式(Eager Initialization)
饿汉模式在程序启动时就创建实例,天然线程安全,但可能浪费资源。
立即学习“C++免费学习笔记(深入)”;
class Singleton {
private:
static Singleton instance;
Singleton() {}
public:
static Singleton& getInstance() {
return instance;
}
};
Singleton Singleton::instance;
由于静态成员变量在程序加载时初始化,不存在多线程竞争问题,简单可靠。
响应式黑色展台设计整站模板,自带内核安装即用,图片文本实现可视化,方便修改,支持多种内容模型及自定义功能,可根据需要自行添加。模板特点: 1、安装即用,自带人人站CMS内核及企业站展示功能(产品,新闻,案例展示等),并可根据需要增加表单 搜索等功能(自带模板) 2、支持响应式 3、前端banner轮播图文本均已进行可视化配置 4、伪静态页面生成 5、支持内容模型、多语言、自定义表单、筛选、多条件搜
局部静态变量(推荐写法)
C++11 起,局部静态变量的初始化是线程安全的,这是最简洁且安全的实现方式。
class Singleton {
private:
Singleton() {}
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
};
这种写法自动保证线程安全,代码简洁,延迟初始化,无需手动管理内存。
注意事项与优化
使用单例模式时需注意以下几点:
- 避免在构造函数中调用虚函数,可能导致未定义行为
- 考虑是否需要支持继承,单例通常不设计为基类
- 若使用指针形式,应提供销毁接口或使用智能指针管理生命周期
- 在程序结束时若仍有单例对象被引用,需防止析构顺序问题
对于需要显式释放资源的情况,可增加 release 方法:
static void release() {
if (instance != nullptr) {
delete instance;
instance = nullptr;
}
}
基本上就这些。局部静态变量的方式是最推荐的现代C++实现方法,简洁且安全。










