c++之单例模式

单例模式(C++实现懒汉式) 单例模式是设计模式中的一种,本文记录和总结单例模式的定义以及C++中实现单例模式的几种懒汉式方式。 参考C++ 单例模式总结与剖析 什么是单例模式 单例(Singleton)模式的特点是这个类在全局只有唯一的一个实例对象,在所有位置都可以通过该类提供的接口访问到这个唯一实例。最经典的使用场景是公用缓存,由一个线程周期性地写,由多个线程读取,此时就可以用单例模式来保证不同线程写和读的是同一个实例。 C++实现单例模式,有几个基础要点: 保证全局只有一个实例。通过把构造函数设置为private可以防止用户 阅读详情

单例模式

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例可以分为饿汉单例和懒汉单例

饿汉式:类定义的时候就去实例化
    优点:以空间换时间,不用担心多线程同步的问题
    缺点:如果没有被使用,会浪费内存空间

懒汉式: 直到第一次使用时才实例化对象
    优点:以时间换空间
    缺点:需要考虑多线程同步的问题

代码:

#include <iostream>
#include <mutex>
using namespace std;

/*
	饿汉式单例
	饿汉式:类定义的时候就去实例化
	优点:以空间换时间,不用担心多线程同步的问题
	缺点:如果没有被使用,会浪费内存空间
	问题:析构函数没有被调用
*/
class GloablLogHungry{
public:
	GloablLogHungry(){
		cout << "GloablLogHungry构造" << endl;
	}
	~GloablLogHungry(){
		cout << "GloablLogHungry析构" << endl;
	}
	static GloablLogHungry* Instance(){
		
		return m_instance;
	}

	void LogNorInfo()
	{
		cout << "饿汉单例记录正常日志" << endl;
	}
	void LogErrorInfo()
	{
		cout << "饿汉单例记录错误日志" << endl;
	}

private:
	static GloablLogHungry* m_instance;
};

GloablLogHungry* GloablLogHungry::m_instance = new GloablLogHungry();

/*
	懒汉式:直到使用时才实例化对象
	优点:以时间换空间
	缺点:需要考虑多线程同步的问题
*/

/*
	懒汉式单例 new
	存在问题:析构函数没有执行 因为使用了new,如果没有显式的delete,会造成内存泄漏,
	      可以采用智能指针解决这个问题
*/
class GloablLogLazy{
public:
	~GloablLogLazy(){
		cout << "GloablLogLazy析构" << endl;
	}

	static GloablLogLazy* Instance(){
			//局部静态对象
		if (m_instance == nullptr)
		{
			std::lock_guard<std::mutex> lock(mutex);	//上锁 自动释放
			if (m_instance == nullptr)	//防止其余线程继续创造实例
			{
				m_instance = new GloablLogLazy;
			}
		}
		return m_instance;
	}

	void LogNorInfo()
	{
		cout << "懒汉单例1记录正常日志" << endl;
	}
	void LogErrorInfo()
	{
		cout << "懒汉单例1记录错误日志" << endl;
	}

private:
	static std::mutex m_mutex;
	static GloablLogLazy *m_instance;
	GloablLogLazy(){
		cout << "GloablLogLazy构造" << endl;
	}	//防止对象被实例化
};

/*
	懒汉式单例2 使用局部静态对象
	优点:具有线程安全性,不需要释放堆内存
*/
class GloablLogLazylocal{
public:
	~GloablLogLazylocal(){
		cout << "GloablLogLazylocal析构" << endl;
	}

	//方式1  
	static GloablLogLazylocal* Instance(){
		static GloablLogLazylocal instance;
		return &instance;
	}

	void LogNorInfo()
	{
		cout << "懒汉单例2记录正常日志" << endl;
	}
	void LogErrorInfo()
	{
		cout << "懒汉单例2记录错误日志" << endl;
	}

private:
	GloablLogLazylocal(){
		cout << "GloablLogLazylocal构造" << endl;
	}	//防止对象被实例化
};


int main()
{
	//GloablLogLazy::Instance()->LogNorInfo();
	//GloablLogLazy::Instance()->LogErrorInfo();

	//推荐使用
	GloablLogLazylocal::Instance()->LogNorInfo();
	GloablLogLazylocal::Instance()->LogErrorInfo();

	//GloablLogHungry::Instance()->LogNorInfo();
	//GloablLogHungry::Instance()->LogErrorInfo();


	return 0;
}

 

hpm6750evk2开发板(四)TCP回送(1000M网口) 再接下来我们修改代码,先找到配置网速的地方,肯定是在enet的初始化函数里面,我们一个函数一个函数找,也可以用单步调试一步一步找,结果发现是在enet_init函数里面调用的rtl8211_basic_mode_default_config函数配置网速的,我们把enet_phy_port_speed_100mbps改为enet_phy_port_speed_1000mbps,重新编译运行试试。首先我们复制一份lwip_tcpecho代码,重命名为lwip_tcpecho_RGMII,如下图所示。 阅读详情

相关推荐

检索生成(RAG) vs 长文本大模型:实际应用中如何选择?

大模型的上下文理解能力直接影响到 LLMs 在复杂任务和长对话中的表现。本期内容聚焦于两种主流技术:长上下文(Large Context Windows)和检索增强生成(RAG)。这两种技术各有何优势?在实际应用中,我们又该如何权衡选择?文章不仅详细阐述了这两种技术的工作原理,还深入分析了它们在效率、准确性和实施成本等方面的差异。文章特别提到了在执行重复性任务时使用 Context Caching 优化长上下文的优势,然而,缓存策略的效果很大程度上取决于提示词的可预测性。

2401_85782938的博客 1254

utilities(C++)——单例(Singleton) (使用智能指针 shared_ptr)

utilities(C++)——单例(Singleton) 上文简单版的单例类的实现的一大核心问题,在于new出来的堆对象不会被释放,就有可能造成内存泄漏的风险。class Singleton { public: // 通过类名获得类实例指针 static Singleton* instance() { if (!_instance)

7719

2021.11.23 Covins 多机器人单目协同建图 跑Euroc数据集 更新

近日,一直在调试如何使用Covins跑通数据集,因为是初学者,所以很多bug出来的时候原理都不懂,只能复制——百度——尝试解决的过程。 现分享一下近日的结果以及与Covins作者帮助解答的一些问题。 使用代码行跑依次跑Euroc多数据集 这里的意思是使用作者提供的covins_examples文件夹中的euroc_examples_mh123_vigba.sh文件,这个文件是将三个Euroc数据集依次运行,跑完第一个数据集,第二个数据集运行的时候在第一个数据集生成地图的基础上继续绘制,由于我只下载了两个数据

qq_42614598的博客 2474

C++第十一节——单例模式 C++11 智能指针 异常 有关讲述

本节内容,我们要介绍四个模块的内容。按照顺序来,分别是 单例模式、C++11、异常和智能指针。 目录 单例模式 要求设计一个类,只能让其创建在堆上。 你实现一个类,要求该类只能在栈上去创建 设计一个函数,要求防止拷贝构造 单例模式: 饿汉模式 懒汉模式 懒汉模式和饿汉模式的对比 C++11 C++11简介 统一的列表初始化 声明类型 auto类型 decltype nullptr 范围for循环 STL的新内容 右值引用和移动语义 左值引用和右值引用比较 .

jxwd的博客 4120

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7761

DevExpress中使用BandGridView实现复合(多行)表头、设置多行表头背景颜色、表格边框颜色

一、实现效果 二、 实现方法 2.1、创建复合表头 ①将创建的GridControl下的GirdView1转化为BandGridView类型; ②创建需要展示的列(指定列的名称【Name】、描述【caption】、数据字段名称【FieldName】) ③绑定列实现复合表头。 注意:如果复合表头有多行,则需要设置新增Band的Row Count,然后设置【Band properties下的AutoFillDown=false】 详细操作如下: 注意:如果要隐藏表格的设计字段内容,则需.

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2893

C++——智能指针简介

介绍了一下智能指针,写博客确实也是一种很好的学习方法,写之后和写之前相比,我对智能指针的理解更加深入了。让我不禁想到一句话:“如果不能把某个知识教会给别人,那就不能说你掌握了这个知识。”大意就是这样吧...

Cipher的博客 783

《备考信息系统项目管理师》 - 专栏介绍和目录

本专栏会持续详细梳理软考高级信息系统项目管理师(高项)的考点、所有历年真题(包括综合知识、案例分析、论文)等,有论文专项,预测模拟题等内容。需要的可以先订阅下哦。

数据知道的博客 2万+

C++11 使用智能指针改进单例模式

本文主要关于如何使用C++11的智能指针改进单例模式。智能指针在C++11版本之后提供,包含在头文件中,shared_ptr、unique_ptr、weak_ptr。设计初衷:线程安全、垃圾回收、单例对象可接受多个参数。 1、使用shared_ptr 相对于一般的单例实现而言,使用了可变参数模板使得单例对象可接受多个参数: #pragma once #include <mutex> #include <memory> template<typename T> class

HelloKandy's Blog 7386

数据分片的三种方式:哈希、一致性哈希、按照数据范围分片

数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。三种常用的数据分片方式:1. 哈希分片2. 一致性哈希分片(Consistent Hash)3. 按照数据范围分片(Range Based)数据分片的应用场景:1. 数据库扩展2. 分布式缓存对集群部署多个缓存节点,提高缓存的处理能力。

wjianwei666的专栏 1133

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

【C++】特殊类的设计、单例模式以及Cpp类型转换

本文深入探讨C++中特殊类的设计方法与类型转换机制。针对特殊类设计,详细解析如何实现禁止拷贝、限制对象创建于堆/栈、防止继承及单例模式(饿汉与懒汉),并分析其应用场景与线程安全问题。在类型转换部分,系统介绍C++四种强制转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)的原理与适用场景,剖析隐式转换的潜在风险(如数据截断与死循环),并对比C风格转换的缺陷。通过实例代码与场景分析,帮助开发者掌握高效、安全的编程实践,提升代码健壮性与可维护性。

2303_77756141的博客 2234

vue2 - 实现移动端H5网页调用手机相册选取图片或打开摄像头相机拍照上传,如何在h5网站浏览器中打开本机相册或相机选择相片,H5调用本地相册/相机上传图片详细教程(附图片压缩功能及上传服务器示例)

vue2手机H5网页,调起安卓苹果ios手机相册和相机,H5实现调用手机摄像头相册实现图片压缩预览删除,vue项目调用摄像头和相册,H5调用手机摄像头,实时拍照上传,VUE2 H5页面如何唤起手机摄像头拍照上传,H5调起手机端的摄像头,html5调用手机摄像头,实现H5调起手机相机和相册,vue H5拍照上传,手机网站浏览器移动端调取相机或相册,实现拍照上传功能,解决苹果ios手机无法打开相册相机问题,无法唤起摄像头怎么办,调取本机系统的相册,vue h5网页调用相机拍照和相册,实现多张图片上传功能,图片压

✅ 精选推荐文章 1万+

C++单例模式封装log4cpp

【代码】C++单例模式封装log4cpp。

caiiiYB的博客 260

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++ 单例模式

新建SingleTon.h class SingleTon { private: static SingleTon* instance; SingleTon(); public: static SingleTon* getInstance(); }; 新建SingleTon.cpp #include "SingleTon.h" SingleTon* SingleTon::instance ...

朱豪凯的博客 316

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

cpp单例模式的实现

单例模式的意义 保证全局只会创建一个对象,比如 日志模块全局只有一个,windows的任务管理器等,这样可以避免频繁的创建销毁对象,还可以避免对共享资源的多重占用,具体例子和好处坏处看参考资料[9],不赘述 几种考虑 几个要考虑的问题:懒加载;;线程安全生存周期的考虑;;反序列化;;反射单例;;克隆单例 首先是一个唯一性,保证全部成员只能访问到一个共同的对象 为了防止对象被创建多次,要把构造函数设为private,以防止被他人调用重复建立,而自己单独实现一个接口用来获取实例(可以把构造函数当作这个

ptgood的博客 1865

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++单例模式(Singleton Pattern)

单例模式 单例模式(Singleton Pattern)是面向对象语言例如C++ 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创...

ThinPikachu的博客 610

c++ 单例模式

1. 什么是单例模式 单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。 定义一个单例类: 私有化它的构造函数,以防止外界创建单例类的对象; 使用类的私有静态指针变量指向类的唯一实例; 使用一个公有的静态方法获取该实例。 2. 懒汉版(Lazy Singleton) 教学版,即懒汉版(Lazy Singleton):单例实例在第一次被使用时才进行初始化,这叫做延迟初

帅的没拼音 2万+

单例模式 C++

懒汉,饿汉,解决内存泄漏,双检锁,原子,C++11 magic static,模板类

IT OR 考公? 2202

C++设计模式——单例模式(Singleton Pattern)

C++设计模式——单例模式(Singleton Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——单例模式(Singleton Pattern)目录定义代码示例懒汉模式线程/内存不安全方式智能指针+双检锁模式和智能指针+call_once模式局部静态变量模式饿汉模式总结参考资料 定义 单例模式顾名思义,保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口。实现单例模式必须注意一下几点: 单例类只能由一个实例化对象。 单例类必须自己提供一个实例化对象。 单例类必须

leonardohaig的博客 1467

C++ 单例模式(模板继承+单例模式)

manager.h main.cpp 模板继承+单例模式 manager.h是基础类,game_manager.h 继承于 manager.hgame_manager.h manager.h main.cpp

雪剑封心 628

单例模式CPP

单例模式CPP

m0_60007338的博客 847

单例模式(Singleton Pattern) C++

设计模式,听起来有点高大上,但实际上它是软件开发中的一套经验总结和指导原则。学习设计模式是我们成为更好的程序员的关键一步,不管你是新手还是老手,它都能带来巨大的益处。为什么要学习设计模式?嗯,学习设计模式有好几个原因,我给你简单说说:首先,它可以提升你的代码质量和可维护性。设计模式是经过验证的解决方案,可以帮助你写出更好的代码。它们消除了重复和冗余的代码,使你的代码更灵活、更易于扩展和维护。其次,学习设计模式有助于团队合作和沟通。

yaoyaohyl的博客 1032

C++单例模式 (Singleton Pattern)

当你看到代码里写着或者这是一个单例。全公司只有这一份。大家都在抢着用它,所以里面肯定有锁 (Mutex)。

weixin_71849365的博客 519
上一篇: c++之观察者模式
下一篇: 裸辞以来的那些事
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值