C++11局部静态变量实现单例最推荐——利用其线程安全、延迟初始化特性,代码简洁且无需手动管理内存;饿汉式启动即构造但不支持延迟初始化;手动指针方式需自行处理线程安全与释放。

单例模式确保一个类只有一个实例,并提供全局访问点。C++ 中常用 懒汉式(线程安全) 和 饿汉式 两种实现,现代 C++(C++11 起)推荐用局部静态变量方式——简洁、线程安全、延迟初始化。
✅ 推荐写法:C++11 局部静态变量(最简且安全)
利用 C++11 标准中“函数内局部静态变量的初始化是线程安全的”特性:
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance; // ✅ 延迟初始化 + 线程安全
return instance;
}
<pre class='brush:php;toolbar:false;'>Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;登录后复制
private: Singleton() = default; // 私有构造,禁止外部创建 ~Singleton() = default; // 可选:若需自定义析构可设为 public/protected };
使用方式:
int main() {
auto& s1 = Singleton::getInstance();
auto& s2 = Singleton::getInstance();
// s1 和 s2 是同一个对象(地址相同)
return 0;
}登录后复制
⚠️ 注意事项:避免常见坑
- 不要在构造函数里调用
getInstance(),否则导致无限递归或未定义行为 - 静态局部变量的析构时机由首次调用时的线程决定,但销毁本身是线程安全的(C++11 起)
- 若单例依赖其他全局对象,注意静态初始化顺序问题;可考虑用指针 + new(手动管理),但需额外处理释放逻辑
? 饿汉式(适合无复杂初始化、要求绝对启动即存在)
全局静态对象,程序启动时即构造,天然线程安全,但不支持延迟初始化:
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~