c++ 单例

#include <iostream>

using namespace std;

class CDataCapabilityMgr
{
private:
    /**
     * 默认构造函数
     */
    CDataCapabilityMgr(){};

public:
    /**
     * 默认析构函数
     */
    ~CDataCapabilityMgr(){};

public:
    static CDataCapabilityMgr* GetInstance();

    void out(){cout<<"signal "<<endl;}
private:
    static CDataCapabilityMgr*  m_pDCapMgr;
};

CDataCapabilityMgr* CDataCapabilityMgr::m_pDCapMgr = NULL; 

CDataCapabilityMgr* CDataCapabilityMgr::GetInstance()
{     
	 m_pDCapMgr = new CDataCapabilityMgr();
     return m_pDCapMgr;
}

int main()
{
     CDataCapabilityMgr::GetInstance()->out();
    CDataCapabilityMgr* p = CDataCapabilityMgr::GetInstance();
	p->out();
	return 0;
}

### C++模式的实现方式 #### 饿汉式模式 饿汉式模式在类加载时就创建好唯一的实对象,这种方式简高效,但由于是在编译期初始化,因此无法延迟实化。其实现如下: ```cpp class Singleton { private: Singleton() {} // 私有构造函数防止外部实化 ~Singleton() {} // 私有析构函数防止被销毁 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton* GetInstance() { return instance; } private: static Singleton* instance; // 声明静态指针 }; // 定义并初始化唯一实 Singleton* Singleton::instance = new Singleton(); ``` 这种实现方式的优点在于线程安全[^1],因为实在程序启动时就已经创建完成。 --- #### 懒汉式模式(线程不安全) 懒汉式模式只有当第一次调用 `GetInstance` 方法时才会创建实,但其默认实现在多线程环境下可能会出现问题。以下是基本实现: ```cpp class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton* GetInstance() { if (instance == nullptr) { // 可能存在竞争条件 instance = new Singleton(); } return instance; } private: static Singleton* instance; }; Singleton* Singleton::instance = nullptr; ``` 上述代码在线程并发场景下可能导致多个线程同时进入 `if (instance == nullptr)` 判断,从而创建多个实[^2]。 --- #### 懒汉式模式(线程安全版) 为了确保线程安全性,可以使用互斥锁或其他同步机制保护临界区。以下是一个改进版本: ```cpp #include <mutex> class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton* GetInstance() { std::lock_guard<std::mutex> lock(mutex); // 加锁确保线程安全 if (instance == nullptr) { instance = new Singleton(); } return instance; } private: static Singleton* instance; static std::mutex mutex; }; Singleton* Singleton::instance = nullptr; std::mutex Singleton::mutex; ``` 虽然这种方法解决了线程安全问题,但它每次调用都会加锁解锁,性能上可能有所损失[^3]。 --- #### 使用局部静态变量的方式 利用 C++ 的特性,在函数内部定义静态变量可以在首次访问时自动初始化,并且由编译器保证线程安全。这是推荐的一种实现方式: ```cpp class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton& GetInstance() { static Singleton instance; // 局部静态变量,线程安全 return instance; } }; ``` 此方法不仅简洁优雅,而且无需显式管理内存,完全依赖于编译器的行为来处理资源分配和释放。 --- #### 总结 以上介绍了多种 C++ 模式的实现方式,每种方式都有各自的优缺点: - **饿汉式**:适合简的应用场景,但在某些情况下会浪费资源。 - **懒汉式(无锁)**:容易实现但不具备线程安全性。 - **懒汉式(带锁)**:解决线程安全问题但牺牲了一定性能。 - **局部静态变量法**:现代 C++ 推荐的方法,既简又安全。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值