C++实现单例模式的方法

 更新时间:2021年12月17日 16:37:10   作者:tarespan  
这篇文章主要为大家介绍了C++实现单例模式的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

饿汉模式

类实例化就会占用内存,浪费资源,效率高,不存在线程安全问题。

class Singleton{
    Singleton() { }
    static Singleton* m_instance_ptr;
public:
    static Singleton* get_instance() {
        return m_instance_ptr;
	}
};
Singleton* Singleton::m_instance_ptr = new Singleton();
int main(){
    Singleton* instance1 = Singleton::get_instance();
    Singleton* instance2 = Singleton::get_instance();
    return 0;
}

懒汉模式

延迟加载,节省资源,效率低,存在线程安全问题。

class Singleton {
    Singleton() { }
    static Singleton* m_instance_ptr;
public:
    static Singleton* get_instance() {
        if(m_instance_ptr == nullptr)
			m_instance_ptr = new Singleton();
        return m_instance_ptr;
    }
};
Singleton* Singleton::m_instance_ptr = nullptr;
int main(){
    Singleton* instance1 = Singleton::get_instance();
    Singleton* instance2 = Singleton::get_instance();
    return 0;
}

锁 + 智能指针

线程安全(锁)+ 内存回收(智能指针)

#include <iostream>
#include <memory>
#include <mutex>
class Singleton {
public:
	typedef std::shared_ptr<Singleton> Ptr;
    static Ptr get_instance() {
        if(m_instance_ptr == nullptr) {
            std::lock_guard<std::mutex> lk(m_mutex);
            if(m_instance_ptr == nullptr)
				m_instance_ptr = std::shared_ptr<Singleton>(new Singleton);
        }
        return m_instance_ptr;
    }
private:
	Singleton() {}
    static Ptr m_instance_ptr;
    static std::mutex m_mutex;
};
Singleton::Ptr Singleton::m_instance_ptr = nullptr;
std::mutex Singleton::m_mutex;
int main(){
    Singleton::Ptr instance1 = Singleton::get_instance();
    Singleton::Ptr instance2 = Singleton::get_instance();
    return 0;
}

局部静态变量

class Singleton {
public:
    Singleton(const Singleton&)=delete;
    static Singleton& get_instance() {
        static Singleton instance;
        return instance;
    }
private:
    Singleton() {}
};
int main() {
	Singleton& instance1 = Singleton::get_instance();
    Singleton& instance2 = Singleton::get_instance();
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++中求余运算符(%)示例详解

    C++中求余运算符(%)示例详解

    求余运算符“%”,二元运算符,具有左结合性。参与运算的量均为整型。求余运算的结果等于两个数相除后的余数。看似很简单的运算符,却也真要掌握用好它也不容易,这篇文章主要介绍了C++中求余运算符(%)的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Prim(普里姆)算法求最小生成树的思想及C语言实例讲解

    Prim(普里姆)算法求最小生成树的思想及C语言实例讲解

    Prim算法能够在带权的图中搜索出最小生成树,这也是各大ACM和面试及考研题目中的热点,下面我们就来详细看一下Prim(普里姆)算法求最小生成树的思想及C语言实例讲解
    2016-06-06
  • Qt实现卡牌对对碰游戏(附demo)

    Qt实现卡牌对对碰游戏(附demo)

    本文主要介绍了Qt实现卡牌对对碰游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • 使用C语言判断英文字符大小写的方法

    使用C语言判断英文字符大小写的方法

    这篇文章主要介绍了使用C语言判断英文字符大小写的方法,分别为isupper()函数和islower()函数的使用,需要的朋友可以参考下
    2015-08-08
  • C++ std::function详解

    C++ std::function详解

    类模版std::function是一种通用的多态函数包装器std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,本文详细的介绍一下,感兴趣的可以了解一下
    2021-10-10
  • C++中vector操作方式详解(多种方式)

    C++中vector操作方式详解(多种方式)

    这篇文章主要介绍了C++中vector操作方式详解(多种方式),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Matlab实现生成箭头坐标轴详解

    Matlab实现生成箭头坐标轴详解

    这篇文章主要介绍了如何利用Matlab实现生成箭头坐标轴,为坐标轴增添箭头,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-03-03
  • 基于C/C++ 常见误区详解

    基于C/C++ 常见误区详解

    本篇文章介绍了在c和c++中一些常见误区的详细概述。需要的朋友参考下
    2013-05-05
  • C++中的String的常用函数用法(最新推荐)

    C++中的String的常用函数用法(最新推荐)

    这篇文章主要介绍了C++中的String的常用函数用法总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • c语言中使用BF-KMP算法实例

    c语言中使用BF-KMP算法实例

    这篇文章主要介绍了c语言中使用BF-KMP算法,大家参考使用
    2013-11-11

最新评论