C++单例模式实现_C++ Singleton设计模式示例

10次阅读

单例模式确保类唯一实例并提供全局访问点。1. 懒汉模式延迟创建但线程不安全;2. 双重检查锁定加互斥锁实现线程安全懒加载;3. 饿汉模式程序启动即创建,线程安全但影响启动性能;4. 局部静态变量利用c++11特性,线程安全且简洁推荐。

C++单例模式实现_C++ Singleton设计模式示例

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式需要考虑线程安全、构造函数私有化、禁止拷贝等细节。下面介绍几种常见的C++单例模式实现方式。

1. 懒汉模式(懒加载,线程不安全)

这种实现方式在第一次调用时才创建实例,但未考虑多线程环境下的竞争问题:

class Singleton { private:     static Singleton* instance;     Singleton() = default;  // 私有构造函数     Singleton(const Singleton&) = delete;            // 禁止拷贝     Singleton& operator=(const Singleton&) = delete; // 禁止赋值 

public: static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; } };

// 静态成员定义 Singleton* Singleton::instance = nullptr;

这种方式在多线程环境下可能创建多个实例,不适合并发场景。

2. 懒汉模式 + 双重检查锁定(线程安全)

使用互斥锁和双重检查机制,保证线程安全且只创建一次实例:

立即学习C++免费学习笔记(深入)”;

#include  

class Singleton { private: static Singleton* instance; static std::mutex mtx; Singleton() = default; Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete;

public: static Singleton* getInstance() { if (instance == nullptr) { std::lock_guard lock(mtx); if (instance == nullptr) { instance = new Singleton(); } } return instance; } };

Singleton* Singleton::instance = nullptr; std::mutex Singleton::mtx;

这种写法避免了每次调用都加锁的性能损耗,适合多线程环境。

3. 饿汉模式(线程安全)

在程序启动时就创建实例,天然线程安全,因为没有延迟初始化的竞争问题:

class Singleton { private:     static Singleton instance;     Singleton() = default;     Singleton(const Singleton&) = delete;     Singleton& operator=(const Singleton&) = delete; 

public: static Singleton& getInstance() { return instance; } };

// 全局静态初始化 Singleton Singleton::instance;

优点是简单且线程安全,缺点是即使未使用也会被创建,可能影响启动性能。

4. 局部静态变量(推荐,C++11起线程安全)

C++11标准规定局部静态变量的初始化是线程安全的,这是最简洁且安全的实现:

class Singleton { private:     Singleton() = default;     Singleton(const Singleton&) = delete;     Singleton& operator=(const Singleton&) = delete; 

public: static Singleton& getInstance() { static Singleton instance; // 局部静态变量,首次调用时初始化 return instance; } };

该方式自动管理生命周期,无需手动释放,代码简洁,推荐在现代C++中使用。

基本上就这些常见实现方式。选择哪种取决于你的需求:是否需要懒加载、是否多线程、是否追求简洁。对于大多数情况,局部静态变量方式是最优解。

text=ZqhQzanResources