C++单例模式的设计

ops/2025/1/21 4:21:27/

单例模式(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/ops/151825.html

相关文章

深度学习核函数

一、核函数的基本概念 核函数在机器学习中具有重要应用价值&#xff0c;常用于支持向量机&#xff08;SVM&#xff09;等算法中。 核函数是面试中经常被考到的知识点&#xff0c;对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多&#xff0c;可…

一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用

一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇&#xff1a;一文大白话讲清楚啥是个webpack第二篇&#xff1a;一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建第三篇一文大白话讲清楚webpack基本使用…

rabbitmq安装延迟队列

在RabbitMQ中&#xff0c;延迟队列是一种特殊的队列类型。当消息被发送到此类队列后&#xff0c;不会立即投递给消费者&#xff0c;而是会等待预设的一段时间&#xff0c;待延迟期满后才进行投递。这种队列在多种场景下都极具价值&#xff0c;比如可用于处理需要在特定时间触发…

Android-目前最稳定和高效的UI适配方案

谈到适配&#xff0c;首先需要介绍几个基本单位&#xff1a; 1、密度无关像素&#xff08;dp&#xff09;&#xff1a; 含义&#xff1a;density-independent pixel&#xff0c;叫dp或dip&#xff0c;与终端上的实际物理像素点无关 单位&#xff1a;dp&#xff0c;可以保证在…

HTML<img>标签

例子 如何插入图片&#xff1a; <img src"img_girl.jpg" alt"Girl in a jacket" width"500" height"600"> 下面有更多“自己尝试”的示例。 定义和用法 该<img>标签用于在 HTML 页面中嵌入图像。 从技术上讲&#x…

父子盒子滑动事件穿透问题

问题描述 当父子盒子都有滚动条时&#xff0c;在子盒子内滚动时&#xff0c;父盒子滚动子盒子无法滚动&#xff0c;直到父盒子滚动到底部&#xff0c;子盒子才滚动 解决 如果是vue的项目&#xff0c;直接在子盒子上添加 wheel.stop""

【LFS/从0构建Linux系统】软件包与补丁安装及环境配置

笔者从虚拟机换回了开发板&#xff0c;系统仍然是Ubuntu。 文章目录 1. 安装包与补丁的安装1.1 wget指令1.2 aria2指令1.3 使用阿里云的整合包 2. 最后的准备阶段(环境配置)3 .总结 在上篇文章&#xff0c;我们完成lfs的硬件准备和磁盘分区。 最终达成这个效果&#xff1a; 那么…

Syncthing在ubuntu下的安装使用

以前安装这个软件的时候&#xff0c; 是在windows和mac上&#xff0c;都是图形化的安装方式&#xff0c;但是ubuntu不太一样&#xff0c;需要增加源&#xff0c;然后执行命令。安装的系统版本是2004。 参考链接1&#xff0c;主要命令包含下面几个部分&#xff1a; 第一步&…