单例模式确保类唯一实例并提供全局访问。C++中常用局部静态变量实现(C++11线程安全),推荐此法因简洁高效;懒汉模式支持延迟初始化但需加锁防竞态;饿汉模式启动即创建,线程安全但可能浪费资源;智能指针可防内存泄漏,但多线程下仍需同步。优先选用局部静态变量方式。

单例设计模式确保一个类只有一个实例,并提供全局访问点。在C++中实现单例模式,需控制构造函数的访问、禁止拷贝,并保证线程安全和资源释放。以下是几种常见且实用的实现方式。
懒汉模式(延迟初始化)
实例在第一次使用时才创建,适合启动开销较大的场景。
// 线程安全的懒汉模式(C++11 及以上)
static std::mutex mtx;
class Singleton {
立即学习“C++免费学习笔记(深入)”;
private:
Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton* instance;
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
这种方式使用双重检查锁定减少锁竞争,C++11 起内存模型支持局部静态变量的线程安全,更推荐下面的方法。
局部静态变量(推荐写法)
C++11 标准保证局部静态变量的初始化是线程安全的,简洁且高效。
class Singleton {
立即学习“C++免费学习笔记(深入)”;
private:
Singleton() { }
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
};
调用 Singleton::getInstance() 即可获取唯一实例。析构由系统自动处理,无需手动释放。
饿汉模式(程序启动时初始化)
在程序加载时就创建实例,避免运行时开销,适用于对启动时间不敏感的场景。
class Singleton {
立即学习“C++免费学习笔记(深入)”;
private:
Singleton();
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton instance;
public:
static Singleton& getInstance() {
return instance;
}
};
Singleton Singleton::instance;
优点是绝对线程安全,缺点是可能提前占用资源。
智能指针管理生命周期(防内存泄漏)
若必须动态分配,可用 std::unique_ptr 管理实例,结合 atexit 或静态析构保证释放。
class Singleton {
立即学习“C++免费学习笔记(深入)”;
private:
Singleton();
static std::unique_ptr instance;
public:
static Singleton& getInstance() {
if (!instance) {
instance = std::make_unique();
}
return *instance;
}
};
std::unique_ptr Singleton::instance = nullptr;
注意:仍需加锁处理多线程环境下的竞态条件。
基本上就这些。推荐优先使用局部静态变量方式,简洁、安全、高效。避免过度设计,除非有特殊需求如跨 DLL 共享实例或自定义销毁顺序。
以上就是c++++如何实现单例设计模式 _c++单例模式实现技巧的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1482428.html
微信扫一扫
支付宝扫一扫