C++ 几种单例模式的写法

本文介绍了在重构服务器项目中遇到的几种C++单例模式实现,包括标准实现等,探讨了不同写法的优缺点,欢迎讨论交流。

这段时间在做一个服务器的重构项目,其中有几个类需要用到单例。整理几种写法,如下。欢迎各位提出意见,或者更好的写法.

1:标准实现

class Singleton{
    private:
        Singleton(){};
        virtual ~Singleton(){};
    public:
        Singleton *Instance();
    protect:
        static Singleton *_instance; 
};
//Singleton.h


Singleton *Singleton::instance()
{

    if(NULL == _instance){
        _instance = new Singleton();
    }
    return _instance;
}
//Singleton.cpp

存在问题:
①:单例对象的资源无法被回收
②:非线程安全,如果两个或者多个线程同时访问Singleton::instance()很可能会内存泄露
### C++设计模式的常见实现方式 #### 1. 饿汉式单例模式 饿汉式单例模式在类加载时就创建好唯一的实,这种方式非常简且线程安全。由于实是在静态初始化阶段完成的,在多线程环境下不会出现问题。 ```cpp class Singleton { public: static Singleton& getInstance() { return instance; } private: static Singleton instance; Singleton() {} // 私有化构造函数 }; // 初始化静态成员变量 Singleton Singleton::instance{}; ``` 这种方法的优点在于其实现简,并且天生就是线程安全的[^3]。 #### 2. 懒汉式单例模式 懒汉式的单例模式会在第一次调用 `getInstance()` 方法的时候才去创建对象,这样可以节省资源开销。但是这种做法不是天然线程安全的,因此需要额外处理同步问题。 ```cpp #include <mutex> class Singleton { public: static Singleton* getInstance() { std::call_once(flag, [](){ pInstance = new Singleton(); }); return pInstance; } private: static Singleton* pInstance; static std::once_flag flag; Singleton() {} }; Singleton* Singleton::pInstance = nullptr; std::once_flag Singleton::flag{}; ``` 这里使用了C++11标准库中的`<mutex>`头文件下的工具来确保线程安全性[^4]。 #### 3. 使用 Magic Statics 的懒汉式单例模式C++11起引入了一个新的特性叫做“magic static”,它允许局部静态变量在其首次执行到定义处之前保持未初始化状态,之后则会被自动初始化一次并一直存在直到程序结束。这使得我们可以写出既延迟又线程安全的单例模式: ```cpp class Singleton { public: static Singleton& getInstance() { static Singleton instance; // magic static return instance; } private: Singleton() {} }; ``` 此方法不仅实现了懒加载而且完全不需要手动管理互斥量或其他形式的手动锁定机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值