C++单例模式的设计

server/2025/1/20 21:33:30/

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在C++中,单例模式通常用于管理全局资源或共享状态。

以下是C++中实现单例模式的几种常见方式:

  1. 懒汉式(Lazy Initialization)
    懒汉式单例在第一次使用时才创建实例。

非线程安全版本:

class Singleton {
public:static Singleton& getInstance() {if (!instance) {instance = new Singleton();}return *instance;}// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}  // 私有构造函数~Singleton() {} // 私有析构函数static Singleton* instance; // 静态实例指针
};Singleton* Singleton::instance = nullptr; // 初始化静态成员

线程安全版本(使用双重检查锁定):

#include <mutex>class Singleton {
public:static Singleton& getInstance() {if (!instance) {std::lock_guard<std::mutex> lock(mutex);if (!instance) {instance = new Singleton();}}return *instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}static Singleton* instance;static std::mutex mutex;
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
  1. 饿汉式(Eager Initialization)
    饿汉式单例在程序启动时即创建实例,线程安全。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // 静态局部变量,程序启动时初始化return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};
  1. Meyer’s Singleton(静态局部变量)
    这是C++中最简洁的单例实现方式,利用了静态局部变量的特性(线程安全且懒加载)。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // 静态局部变量,线程安全且懒加载return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};

http://www.ppmy.cn/server/159990.html

相关文章

Ubuntu 24.04 LTS 服务器折腾集

目录 Ubuntu 更改软件源Ubuntu 系统语言英文改中文windows 远程链接 Ubuntu 图形界面Windows 通过 openssh 连接 UbuntuUbuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locationsUbuntu 开启 SMB 服务&#xff0c;并通过 windows 访问Ubuntu安装Tailscale&am…

重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 整合 Elasticsearch 8.x &#xff08;二&#xff09;使用Repository 1. 环境准备 1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤 2.1 创建实体类2.2 创建 Reposit…

Node.js使用教程

Node.js使用教程 Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它让JavaScript运行在服务器端。以下是一个简单的Node.js使用教程&#xff1a; 一、 Node.js开发环境和编译 1.1 安装Node.js 访问Node.js官网下载并安装适合您操作系统的Node.js版本。 1…

opencv_图像处理_去噪声_采用中值滤波

background cv2.medianBlur(image, 25) noise cv2.absdiff(image, background)这句话的意思是使用 中值滤波 对图像进行平滑处理&#xff0c;目的是去除图像中的噪声&#xff0c;同时保留图像的主要结构。下面我会详细解释这句话的含义&#xff1a; 1. 中值滤波&#xff08;M…

js使用qrcode与canvas生成带logo的二维码

qrcode库 文档 https://www.npmjs.com/package/qrcode 安装 npm i qrcode 使用 errorCorrectionLevel: H // 容错率&#xff08;H是最高&#xff0c;其它看文档&#xff09; width: 200 // 大小 margin: 2 // 边距 import QRCode from qrcodeconst testFn async () > {c…

【Golang 面试题】每日 3 题(三十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

安装指南:LLaMA Factory、AutoGPTQ 和 vllm

安装指南&#xff1a;LLaMA Factory、AutoGPTQ 和 vllm 在本文中&#xff0c;我们将详细介绍如何安装 LLaMA Factory、AutoGPTQ 和 vllm&#xff0c;这些工具在大型语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;的微调和量化中非常有用。我…

JavaScript笔记APIs篇01——DOM获取与属性操作

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…