Meyers单例模式是C++推荐写法,利用局部静态变量实现线程安全的懒加载,代码简洁且自动管理生命周期,适用于大多数场景。

单例模式确保一个类只有一个实例,并提供一个全局访问点。在 C++ 中,实现单例模式需要考虑线程安全、构造顺序、资源释放等问题。下面介绍几种常见的 C++ 单例写法,并分析其优缺点。
利用函数内部的局部静态变量具有“延迟初始化”和线程安全特性(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; };
优点:通过全局或静态变量提前构造单例,避免多线程竞争:
class Singleton {
public:
static Singleton& getInstance() {
return instance;
}
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;private: Singleton() = default; ~Singleton() = default;
<code>static Singleton instance; // 程序启动时构造
};
立即学习“C++免费学习笔记(深入)”;
// 定义静态成员 Singleton Singleton::instance;
优点:动态分配内存,配合互斥锁实现线程安全的懒加载:
#include <mutex>
<p>class Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) { // 双重检查锁定
std::lock<em>guard<std::mutex> lock(mutex</em>);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}</p><pre class='brush:php;toolbar:false;'>Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;private: Singleton() = default; ~Singleton() = default;
<pre class="brush:php;toolbar:false;">static Singleton* instance; static std::mutex mutex_;
};
立即学习“C++免费学习笔记(深入)”;
// 静态成员定义 Singleton* Singleton::instance = nullptr; std::mutex Singleton::mutex_;
优点:结合 unique_ptr 或 shared_ptr 自动释放资源:
#include <memory>
#include <mutex>
<p>class Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock<em>guard<std::mutex> lock(mutex</em>);
if (instance == nullptr) {
instance.reset(new Singleton());
}
}
return instance.get();
}</p><pre class='brush:php;toolbar:false;'>Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;private: Singleton() = default; ~Singleton() = default;
<pre class="brush:php;toolbar:false;">static std::unique_ptr<Singleton> instance; static std::mutex mutex_;
};
立即学习“C++免费学习笔记(深入)”;
std::uniqueptr<Singleton> Singleton::instance = nullptr; std::mutex Singleton::mutex;
注意: 此写法仍需手动调用 reset,且无法完全避免多次 new/delete。即第一种“局部静态变量”写法,也称为 Scott Meyers 单例,是现代 C++ 最常用方式:
<pre class="brush:php;toolbar:false;">class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
<p>private:
Singleton();
~Singleton();
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};</p>基本上就这些。对于绝大多数项目,推荐使用 Meyers 单例 写法。它简洁、安全、高效,符合现代 C++ 的设计哲学。只有在特殊需求下(如必须控制析构顺序或跨 DLL 共享),才考虑其他变体。不复杂但容易忽略细节。
以上就是C++ 单例模式实现代码_C++设计模式之单例写法分析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号