当前位置: 首页 > news >正文

长春做网站选长春万网seo优化服务

长春做网站选长春万网,seo优化服务,厦门建设局投诉电话,宿迁网站建设cy0001文章目录 25. 单例模式25.1. 饿汉式单例模式25.2. 懒汉式单例模式25.2.1. 解决方案125.2.2. 解决方案2 (推荐写法) 运行在VS2022,x86,Debug下。 25. 单例模式 单例即该类只能有一个实例。 应用:如在游戏开发中&#x…

文章目录

  • 25. 单例模式
    • 25.1. 饿汉式单例模式
    • 25.2. 懒汉式单例模式
      • 25.2.1. 解决方案1
      • 25.2.2. 解决方案2 (推荐写法)

运行在VS2022,x86,Debug下。

25. 单例模式

  • 单例即该类只能有一个实例。

  • 应用:如在游戏开发中,可以使用单例模式来管理各种资源,确保这些资源在整个游戏中只被加载和管理一次。

  • 实现

    • 将构造函数和析构函数私有,不允许外部构造或析构类对象。
    • 将拷贝构造函数、赋值运算符、移动构造函数和移动赋值运算符删除,不允许复制类对象。
    • 需要有一个静态函数接口,返回唯一的静态实例。
  • 分类

    • 饿汉式单例模式:在main()开始前,实例就已经存在了。
    • 懒汉式单例模式:在第一次调用获取实例时才创建实例。

25.1. 饿汉式单例模式

  • 代码如下。
class Singleton
{
private:Singleton() {} //私有构造函数~Singleton() {} //私有析构函数Singleton(const Singleton&) = delete; //删除拷贝构造函数Singleton& operator=(const Singleton&) = delete; //删除赋值运算符Singleton(Singleton&&) = delete; //删除移动构造函数Singleton & operator=(Singleton&&) = delete; //删除移动赋值运算符private:static Singleton instance; //静态成员变量,存储实例public:static Singleton* getInstance() //静态成员函数,获取实例{return &instance;}
};Singleton Singleton::instance; //静态成员变量实例化int main()
{Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();return 0;
}
  • 在main()处设置断点,监视窗口如下,实例的内存地址为0x00E0C138。

在这里插入图片描述

  • 总结
    • 优点:线程安全,因为程序运行时就已经生成唯一的实例。
    • 缺点:不是按需创建实例。

25.2. 懒汉式单例模式

  • 新增一个静态函数接口,用于释放实例内存。
  • 代码如下。
class Singleton
{
private:Singleton(){} //私有构造函数~Singleton(){} //私有析构函数Singleton(const Singleton&) = delete; //删除拷贝构造函数Singleton& operator=(const Singleton&) = delete; //删除赋值运算符Singleton(Singleton&&) = delete; //删除移动构造函数Singleton & operator=(Singleton&&) = delete; //删除移动赋值运算符private:static Singleton* instance; //静态成员变量,存储实例public:static Singleton* getInstance() //静态成员函数,获取实例{if (instance == nullptr)instance = new Singleton();return instance;}static void deleteInstance() //静态成员函数,释放实例{if (instance != nullptr){delete instance;instance = nullptr;}}
};Singleton* Singleton::instance = nullptr; //静态成员变量定义和初始化int main() 
{Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();Singleton::deleteInstance();return 0;
}
  • 在main()处设置断点,监视窗口如下,此时未生成实例。

在这里插入图片描述

  • 第一次调用getInstance()获取实例时,生成实例,实例的内存地址为0x00E16A08。

在这里插入图片描述

  • 总结
    • 优点:按需创建实例。
    • 缺点:
      • 不是线程安全,如两个线程同时调用getInstance()获取实例,同时运行到判断instance是否为nullptr的if语句,并且instance并未创建,那么两个线程都会创建一个实例。
      • 内存释放问题,在程序执行结束时,调用deleteInstance()释放实例内存,但是要确保delete之后,没有代码再调用getInstance()或者访问已释放的内存,存在安全隐患。

25.2.1. 解决方案1

  • 针对线程安全问题,加锁。
  • 针对内存释放问题,对于全局变量或静态变量,main()返回后会调用析构函数。基于此,可以定义一个静态成员变量,用于释放实例内存。
  • 代码如下。
mutex m;class Singleton
{
private:Singleton() {} //私有构造函数~Singleton() {} //私有析构函数Singleton(const Singleton&) = delete; //删除拷贝构造函数Singleton& operator=(const Singleton&) = delete; //删除赋值运算符Singleton(Singleton&&) = delete; //删除移动构造函数Singleton& operator=(Singleton&&) = delete; //删除移动赋值运算符static Singleton* instance; //静态成员变量,存储实例class Garbo //在析构函数中释放实例{public:~Garbo(){if (Singleton::instance != nullptr){delete instance;instance = nullptr;}}};static Garbo garbo; //静态成员变量,在程序执行结束时,系统会调用它的析构函数public:static Singleton* getInstance() //静态成员函数,获取实例{if (instance == nullptr) //加锁前判断,这样如果实例存在,就不需加锁了{lock_guard<mutex>lock(m); //创建实例前加锁if (instance == nullptr)instance = new Singleton();}return instance;}
};Singleton* Singleton::instance = nullptr; //静态成员变量定义和初始化int main()
{Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();return 0;
}

25.2.2. 解决方案2 (推荐写法)

  • 在静态函数接口里,定义局部静态变量,存储实例。那么它会在第一次调用获取实例时才创建,可以按需创建实例。同时内部__Init_thread_header()和_Init_thread_footer()可以保证局部静态变量的初始化是线程安全的。
  • 代码如下。
class Singleton
{
private:Singleton() {} //私有构造函数~Singleton() {} //私有析构函数Singleton(const Singleton&) = delete; //删除拷贝构造函数Singleton& operator=(const Singleton&) = delete; //删除赋值运算符Singleton(Singleton&&) = delete; //删除移动构造函数Singleton& operator=(Singleton&&) = delete; //删除移动赋值运算符public:static Singleton* getInstance() //静态成员函数,获取实例{static Singleton instance; //局部静态成员变量,存储实例return &instance;}
};int main()
{Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();return 0;
}
  • 反汇编分析如下。

在这里插入图片描述

http://www.zhongyajixie.com/news/38000.html

相关文章:

  • 网站域名可以自己做吗青岛网站制作公司
  • 郑州城乡建设委员会网站怎么开网站平台挣钱
  • 支付宝怎么做网站维护重庆高端网站seo
  • 做网站的总结精准营销名词解释
  • thinkphp做直播网站品牌运营中心
  • 杭州搜索推广公司天津seo实战培训
  • 银行党风廉政建设考试网站西点培训
  • 中企动力的网站如何seminar怎么读
  • 网上怎么接单做网站seo优化软件有哪些
  • php企业网站开发价格口碑营销的主要手段有哪些
  • 学校网站 asp免费的推文制作网站
  • 网站首页被k 做跳转济南疫情最新消息
  • 支持快钱支付的网站站长工具在线查询
  • 中国商标买卖网站seo软文推广
  • 猎头网站 做猎头的流程成都网站建设方案托管
  • 深圳开发网站开发网络优化是干什么的
  • 做公众号需要做网站吗网站免费网站免费
  • 深圳开发公司河北seo基础教程
  • 小视频的网站怎么做的seo上海推广公司
  • 网站开发程序有哪些seo多久可以学会
  • wordpress主题自定义打不开石家庄seo排名外包
  • 移动端处理器天梯图seo顾问服
  • 做家教网站怎么样浏览器打开是2345网址导航
  • 哪些专门做批发的网站有哪些网络营销郑州优化推广公司
  • php网站 上传学电脑培训班多少一个月
  • 权威网站发布平台新媒体seo指的是什么
  • 网站建设的毕业设计选题管理系统软文模板
  • 做外贸必须知道的网站百度搜索一下
  • 四川聚锋建设工程有限公司官方网站市场监督管理局官网
  • 个人网站建设架构网站优化seo教程