单例模式-C++实现

C++11实现单例模式 1 线程不安全的单例模式 类的静态成员变量由所有对象共享,也就是在内存中只有一份,我们可以利用这个特性凭直觉写出如下的单例模式class Singleton { public: static Singleton* getInstance(); Singleton(const Singleton& rhs) = delete; Singleton& operator=(con... 阅读详情

单例模式  保证一个类只有一个实例,并提供一个访问它的全局访问点

所谓只有一个实例 那就让别人不能随便new 只能从类的一个静态方法得到它的实例,构造函数设为私有的即可

class Singleton
{
private:
static Singleton* Instance;
private:
Singleton();
public:

static Singleton* GetInstance();

};

代码实现:

#include "StdAfx.h"
#include "Singleton.h"
Singleton*  Singleton::Instance = NULL;

Singleton::Singleton(void)
{
}
Singleton* Singleton::GetInstance()
{
if(Instance == NULL)
{
Instance = new Singleton();
}
return Instance;
}

貌似很OK,但是其实我们这边的入口点,不是只有一个的

当我们没有拷贝构造函数和赋值函数的时候,编译器会默认生成一个,所以说程序的入扣点除了现在的静态函数外,还有默认的其他函数

那怎么办呢?

好办,直接将这些函数设为私有的,不实现即可,代码如下

class Singleton

{

private:

static Singleton* Instance;

private:

Singleton();

Singleton(const Singleton&);

Singleton& operator=(const Singleton&);

public:

static Singleton* GetInstance();

};

实现代码同上

那现在怎么样,貌似还有问题,我们看GetInstance()的实现

如果有多个线程进行这个函数调用,会发生什么,会出现创建多个实例,并导致内存泄露

怎么办,加锁

锁文件代码如下:

Lock.h

#include<Windows.h>

class Lock

{

public:
Lock(void);
~Lock(void);
void RequireLock();
void ReleaseLock();
private:
CRITICAL_SECTION m_lock;

};

Lock.cpp

#include "StdAfx.h"
#include "Lock.h"
#include<Windows.h>

Lock::Lock(void)
{

InitializeCriticalSection(&m_lock);
}

Lock::~Lock(void)
{
DeleteCriticalSection(&m_lock);
}
void Lock::RequireLock()
{
EnterCriticalSection(&m_lock);
}
void Lock::ReleaseLock()
{
LeaveCriticalSection(&m_lock);
}

那单例类代码如下:

Singleton.h

#pragma once
#include "Lock.h"
class Singleton
{
private:

static Singleton* Instance;
static  Lock* myLock;
private:
  Singleton();

Singleton(const Singleton&);

Singleton& operator=(const Singleton&);

public:

static Singleton* GetInstance();

    
};

Singleton.cpp

#include "StdAfx.h"
#include "Singleton.h"
Singleton*  Singleton::Instance = NULL;
Lock*  Singleton::myLock = new Lock();
Singleton::Singleton(void)
{
}
Singleton* Singleton::GetInstance()
{
myLock->RequireLock();
if(Instance == NULL)
{
Instance = new Singleton();
}
myLock->ReleaseLock();
return Instance;
}
一切似乎无懈可击,可是当考虑到我们的对象时new出来的,我们需要销毁它,怎么办,将析构函数拿出来调用,我想既然有一个全局的入口点,就应该有一个全局的出口点,再定义一个静态函数,用于销毁new出来的对象,并将析构函数设为私有的

可是问题来了,销毁也有new相同的问题,如果不进行同步的法,一个对象会销毁两次,也会有内存泄露,那我们只用再加一把锁即可,可是还有一种情况,当一个线程创建实例的时候,另外一个线程正在销毁它,好吧,这也需要同步,不能我正在创建的时候,你在销毁它,对象肯定是乱的了

所以不管创建和销毁,我们必须要得到两把锁,一把是用于管理对象创建,一把用于管理对象销毁,不管你是创建和销毁对象,你必须保证先得到这两把锁,保证在任一时刻只有一个线程在创建或者销毁

代码如下:

Singleton.h

class Singleton
{
private:
static Singleton* Instance;
static  Lock* myLock;
static Lock* myDeleteLock;
private:
Singleton();
  Singleton(const Singleton&);

Singleton& operator=(const Singleton&);

 ~Singleton();


public:

static Singleton* GetInstance();

static void DestroyInstance();
};

Singleton.cpp

Singleton*  Singleton::Instance = NULL;
Lock*  Singleton::myLock = new Lock();
Lock*  Singleton::myDeleteLock = new Lock();
Singleton::Singleton(void)
{
}
Singleton::~Singleton(void)
{

}
Singleton* Singleton::GetInstance()
{

myLock->RequireLock();

myDeleteLock->RequireLock();

if(Instance == NULL)
{
Instance = new Singleton();
}
myDeleteLock->ReleaseLock();
myLock->ReleaseLock();
return Instance;
}
void Singleton::DestroyInstance()
{
myLock->RequireLock();
myDeleteLock->RequireLock();
if(Instance != NULL)
{
delete Instance;
Instance = NULL;
}
myDeleteLock->ReleaseLock();
myLock->ReleaseLock();
}

欢迎拍砖





c++实现单例模式完整源代码 c++实现单例模式完整源代码Singleton.hppmain.cpp Singleton.hpp #ifndef __SINGLETON_H__ #define __SINGLETON_H__ #include <iostream> #include <string.h> #include <mutex> using namespace std; class Singleton_Lazy { public: static Singleton_Lazy* getIn 阅读详情

相关推荐

Python实战:5分钟搞定VCF文件中每个样本的SNP统计(附bcftools安装指南)

本文介绍了三种高效统计VCF文件中每个样本SNP数量的Python方法,包括原生解析、结合bcftools的推荐方案以及使用PyVCF3专业库。特别推荐bcftools结合Python的方法,适用于中大型VCF文件,显著提升处理效率。文章还提供了bcftools安装指南和进阶统计技巧,帮助生物信息学分析人员快速完成SNP统计任务。

weixin_30555125的博客 494

【C++】C++ 单例模式总结(5种单例实现方法)

C++ 单例模式的几种实现方式。

unonoi的博客 12万+

STM32H7B0VBT6使用Free RTOS配置SD卡+Fatfs文件管理系统

STM32H7B0VBT6使用Free RTOS配置SD卡+Fatfs文件管理系统,记录配置过程

Jack的小窝 5942

单例模式——C++实现

使用C++实现单例模式的饿汉模式、懒汉模式(线程安全)

weixin_52152452的博客 1378

from pointnet2_ops import pointnet2_utils 安装过程

pointnet2_ops

goodgoodstudy___的博客 8362

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1945

C++单例模式的几种实现

本文介绍C++单例模式的集中实现方式,以及利弊 局部静态变量方式 //通过静态成员变量实现单例 //懒汉式 class Single2 { private: Single2() { } Single2(const Single2 &) = delete; Single2 &operator=(const Single2 &) = delete; public: static Single2 &GetInst() {

恋恋风辰的技术博客 6359

LVGL iPhone Duo 开合过渡

环境:LVGL 9.x(需要软件模糊),窗口建议 1280×800。界面文案英文(默认 Montserrat 无 CJK)。

摸鱼专家 149

C++ 单例模式

C++ 单例模式 Arkin Mechanic . Keep coding. ​关注他 27 人赞同了该文章 1. 什么是单例模式 单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。 定义一个单例类: 私有化它的构造函数,以防止外界创建单例类的对象; ...

jfkidear的专栏 1159

Isaac Sim 入门教程(四)强化学习策略训练宇树人形机器人四足机器人示例

isaac_sim_policy_example Extension 是在 Isaac Sim 中部署 Isaac Lab 强化学习策略的一个框架和一组辅助函数。有关在 Isaac Sim 中训练和构建策略的详细信息,请访问在 Isaac Sim 中部署策略。该扩展程序默认已启用。如果被禁用,可在扩展管理器中搜索 isaacsim.robot.policy.example 重新启用。要运行下面的示例,请激活 “视窗”>“示例”>“机器人示例”,这将打开 “机器人示例 ”选项卡。

机器人控制与仿真应用 3926

MFC 中实现 WebSocket 客户端以支持实时双向通信

3. **协议兼容**:若服务器使用 `wss://`(加密),需在 `lws_client_connect_info` 中配置 SSL 相关参数(`ssl_connection = LCCSCF_USE_SSL`)。- 编辑框(`m_editUrl`):输入 WebSocket 服务器地址(如 `ws://echo.websocket.events`)。2. 将编译后的库文件(`.lib`、`.dll`)和头文件路径添加到 MFC 项目中(项目属性 -> VC++ 目录)。// UI:服务器地址。

寒寒豆豆软件公司的博客 202

C++单例模式实现

单例模式 单例模式:要求类只有一个对象实例,数据库连接池、线程池以及Windows任务管理器都是单例模式的应用。 那么如何去实现一个单例模式呢?C++中有5种实现的方式,首先从最简单说起 1. 单线程实现 常规写法 class Singleton{ public: static Singleton* getInstance() { if(_instance == nullptr) ...

一个不知名码农的专栏 3492

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

weixin_45735391的博客 4万+

cpp单例模式的实现

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

ptgood的博客 1865

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ 实现单例模式

C++实现单例模式单例模式的基本概念基本实现完整实现 单例模式的基本概念 基本实现 #include<cstdio> class singleton { public: static singleton* get_singleton(){ if(instance_ == nullptr){ instance_ = new single...

zlgahu的博客 5594

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

单例模式的C++实现

逻辑上,双检查锁是没问题的,一旦m_instance不为空,多线程都可以访问它,但可惜的是编译器优化会reorder,也就是汇编代码的顺序和高级语言代码顺序不是完全一致的,比如,new的过程会先分配内存,再执行类的构造函数,假设在分配完内存后,进行了线程切换,此时m_instance不是nullptr,但m_instance代表的对象可能还没有构造好就被使用了。,在其它语言中,如Java中不用这么复杂,给m_instance加个volatile关键字就行了,VC下也可以,但不是跨平台的。

qq_39980953的博客 1755

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++实现单例模式

C++单例模式

u012732168的博客 1万+

设计模式实现CPP——单例模式

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。常用于共享资源(如配置信息、线程池、数据库连接等),保证全局一致性。

qq_45835091的博客 485

单例模式C++实现

前一段时间看自学了设计模式,发现好多书的java实现的。因为本人是从事C++开发的,因此想尝试用C++自己实现一遍,加深理解。不足之处还望大神们赐教。 单例模式 定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 适用性:当类只能有一个实例。这种情况应该很常见,所以单例模式也是个人觉得最常用的简单设计模式之一了。 优点: 1、  对唯一实例的受控访问 2、  缩小

hai200501019的专栏 875

C++单例模式的实现

很多场景下都可以用到单例模式作为设计模式,比如:线程池类,服务器类(待实现挖坑),内存池类(待实现挖坑),单例模式的两种实现方式:饿汉模式和懒汉模式饿汉模式的缺点如下:1. 由于编译时需要初始化静态变量,导致程序启动变慢2. 如果有两个单例模式设计的类,而且其中一个依赖另一个,但是编译器并不确定哪个类的先初始化,此时有可能导致编译错误。

weixin_46366676的博客 1268

设计模式之单例模式(Singleton Pattern)C++实现

单例模式(Singleton Pattern):这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 主要解决:解决一个全局使用的类,频繁地创建和销毁 缺点:没有接口,不能继承 使用场景:产生唯一序列号、web中的计数器、消耗资源多的(I/O、数据库连接) 注意:

奔跑的小河 562

C++单例模式的六种实现

(如有错误,请联系我更正,以免误导他人!)        C++中单例模式的应用非常广泛,在我们平时使用的windows操作系统中就存在大量的单例应用。如:回收站、任务管理器、文件资源管理器等。        单例模式的实现也有许许多多的方法,每种实现方法都有各自的优点和实用场景。 实现一: class Singleton { public: static Singleton* get

break;的博客 1827

用c++来实现单例模式

单例模式是使用广泛的一种设计模式,又称为单件模式、单子模式。其意图是保证一个类仅有一个实列,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多的地方都需要这样的功能模块,如系统的日志输出,操作系统只能有一个窗口管理器,一台pc连一个键盘等等。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一点,但这样的代码显的很不优雅。 使用全局对象能够保证方便地访问实例,但...

jellocomeon的专栏 397

C++实现单例模式(详细版)

以循序渐进地方式详细介绍各种单例模式C++实现方法(详细写了6种方法)及其特点,并给出了测试案例

ReLesEason的博客 3646
上一篇: vs 使用小技巧
下一篇: 毕业论文Start
LearnITing
博客等级 码龄15年 14粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值