单例模式通过私有构造函数、禁用拷贝和赋值,确保类唯一实例并提供全局访问点。饿汉式在程序启动时创建实例,线程安全,适用于对启动时间不敏感的场景,通过类外定义静态成员实现。懒汉式在首次调用时初始化,节省资源,但需处理线程安全问题。C++11后推荐使用局部静态变量的Meyer’s Singleton,延迟初始化且自动线程安全。对于需精细控制生命周期或兼容旧标准的情况,可采用std::unique_ptr配合std::mutex实现带锁的懒汉式,避免内存泄漏。选择方式应根据项目需求和C++标准支持决定,现代C++中Meyer’s Singleton为首选方案。

单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式,关键在于控制构造函数的访问权限、禁止拷贝和赋值,并保证线程安全的实例创建。
饿汉式(Eager Initialization)
饿汉式在程序启动时就创建实例,天然线程安全,适用于对启动时间不敏感的场景。
实现方式:静态成员变量在类外定义并初始化,对象在加载时即被构造。
示例代码:
class Singleton {private: static Singleton instance; // 静态实例 Singleton() = default; // 私有构造函数public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
static Singleton& getInstance() { return instance;}void doSomething() { // 示例方法}
};
立即学习“C++免费学习笔记(深入)”;
// 类外定义静态成员Singleton Singleton::instance;
懒汉式(Lazy Initialization) + 双重检查锁定
懒汉式在第一次调用时才创建实例,节省资源,但需处理多线程并发问题。
C++11以后,使用局部静态变量可实现“Meyer's Singleton”,简洁且线程安全。
推荐写法(基于C++11局部静态):
class Singleton {private: Singleton() = default;public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
static Singleton& getInstance() { static Singleton instance; // 局部静态变量,延迟初始化,线程安全 return instance;}void doSomething() { // 示例方法}
};
带智能指针的懒汉式(手动管理)
若需要更精细控制生命周期或兼容旧标准,可用std::unique_ptr配合互斥锁实现。
注意:需确保析构顺序安全,避免静态析构问题。
#include #includeclass Singleton {private:static std::unique_ptr instance;static std::mutex mtx;
Singleton() = default;
public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
static Singleton* getInstance() { std::lock_guard lock(mtx); if (!instance) { instance = std::unique_ptr(new Singleton); } return instance.get();}
};
立即学习“C++免费学习笔记(深入)”;
// 类外定义std::unique_ptr Singleton::instance = nullptr;std::mutex Singleton::mtx;
关键要点总结
私有化构造函数、拷贝构造和赋值操作符,防止外部创建多个实例使用static局部变量是C++11后最简洁安全的方式饿汉式适合简单场景,懒汉式适合资源敏感型应用多线程环境下必须保证初始化过程的线程安全避免动态分配带来的内存泄漏风险,优先使用栈上静态对象
基本上就这些。选择哪种方式取决于项目需求和C++标准支持情况。Meyer's Singleton 是现代C++中最常用也最推荐的做法。
以上就是c++++中如何实现单例模式_c++设计模式之单例模式实现方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1478543.html
微信扫一扫
支付宝扫一扫