news 2026/5/7 11:59:33

单例模式(C++)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单例模式(C++)

C++ 单例模式

单例模式(Singleton Pattern)

一、核心定义

单例模式是创建型设计模式,确保一个类有且只有一个实例,并提供一个全局访问点获取该实例。

二、核心特点

  1. 一个类只能创建唯一对象
  2. 自行创建实例
  3. 向整个系统提供这个实例
  4. 无参构造函数私有化
  5. 禁止拷贝、禁止赋值

三、使用场景

  • 日志管理器
  • 配置文件读取
  • 数据库连接池
  • 线程池、缓存、打印机池
  • 全局唯一的工具类

四、C++ 单例模式 5 种标准实现(可直接编译)

实现 1:饿汉式(最简单、线程安全)

程序启动时就创建实例,天生线程安全,无多线程问题。

#include<iostream>usingnamespacestd;classSingleton{public:// 全局访问点staticSingleton&getInstance(){returninstance;}voidshow(){cout<<"饿汉式单例"<<endl;}// 禁止拷贝、禁止赋值Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;private:// 构造私有Singleton(){}// 程序启动就初始化staticSingleton instance;};// 静态变量初始化Singleton Singleton::instance;intmain(){Singleton&s1=Singleton::getInstance();Singleton&s2=Singleton::getInstance();cout<<&s1<<endl;cout<<&s2<<endl;// 地址相同return0;}

优点:简单、线程安全
缺点:不用也会创建,可能浪费资源


实现 2:懒汉式(基础版,非线程安全)

第一次使用时才创建实例。

#include<iostream>usingnamespacestd;classSingleton{public:staticSingleton*getInstance(){if(instance==nullptr){instance=newSingleton();}returninstance;}voidshow(){cout<<"懒汉式单例"<<endl;}Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;private:Singleton(){}staticSingleton*instance;};Singleton*Singleton::instance=nullptr;intmain(){Singleton*s1=Singleton::getInstance();Singleton*s2=Singleton::getInstance();return0;}

注意多线程不安全,高并发会创建多个实例


实现 3:线程安全懒汉式(加锁)

C++11 线程安全版本

#include<iostream>#include<mutex>usingnamespacestd;mutex mtx;classSingleton{public:staticSingleton*getInstance(){lock_guard<mutex>lock(mtx);if(instance==nullptr){instance=newSingleton();}returninstance;}Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;private:Singleton(){}staticSingleton*instance;};Singleton*Singleton::instance=nullptr;

实现 4:双检查锁 DCL(高性能线程安全)

企业最常用

#include<iostream>#include<mutex>usingnamespacestd;classSingleton{public:staticSingleton*getInstance(){if(instance==nullptr){lock_guard<mutex>lock(mtx);if(instance==nullptr){instance=newSingleton();}}returninstance;}Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;private:Singleton(){}staticSingleton*instance;staticmutex mtx;};Singleton*Singleton::instance=nullptr;mutex Singleton::mtx;

实现 5:C++11 最优方案 Meyers 单例(推荐!)

最简单、线程安全、无内存泄漏

#include<iostream>usingnamespacestd;classSingleton{public:staticSingleton&getInstance(){staticSingleton instance;returninstance;}voidshow(){cout<<"Meyers 单例(C++11最佳)"<<endl;}Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;private:Singleton(){}};intmain(){Singleton&s1=Singleton::getInstance();Singleton&s2=Singleton::getInstance();s1.show();return0;}

优点

  • 线程安全(C++11 保证静态变量初始化原子性)
  • 懒加载
  • 无内存泄漏
  • 代码极简

五、单例模式自动释放(析构安全)

加入内部回收类,程序结束自动释放单例

#include<iostream>usingnamespacestd;classSingleton{public:staticSingleton*getInstance(){if(instance==nullptr){instance=newSingleton();}returninstance;}classAutoDelete{public:~AutoDelete(){if(Singleton::instance){deleteSingleton::instance;cout<<"单例已自动释放"<<endl;}}};private:Singleton(){}staticSingleton*instance;staticAutoDelete ad;};Singleton*Singleton::instance=nullptr;Singleton::AutoDelete Singleton::ad;

六、五种单例对比总结

实现方式线程安全性能推荐指数
饿汉式安全⭐⭐⭐
基础懒汉式不安全不推荐
加锁懒汉式安全⭐⭐
双检查锁 DCL安全⭐⭐⭐⭐
Meyers 单例安全极高⭐⭐⭐⭐⭐

七、C++ 单例必须遵守的 4 条规则

  1. 构造函数私有化
  2. 禁用拷贝构造
  3. 禁用赋值重载
  4. 提供全局唯一访问点

八、企业最佳实践

  1. 优先使用Meyers 单例(C++11 最优)
  2. 禁止手动new/delete,使用智能指针或自动释放
  3. 多线程环境必须使用线程安全版本
  4. 单例不建议存放大量数据,避免内存飙升
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 11:58:10

ChatGPT-Next-Web-Pro深度解析:从开源项目到企业级AI应用部署指南

1. 项目概述与核心价值最近在折腾AI应用部署的朋友&#xff0c;估计都听说过ChatGPT-Next-Web这个项目。它就像一个万能钥匙&#xff0c;让你能轻松搭建一个属于自己的、界面美观的ChatGPT Web客户端。但今天要聊的&#xff0c;是它的一个“Pro”版本——vual/ChatGPT-Next-Web…

作者头像 李华
网站建设 2026/5/7 11:56:14

基于ChatGPT的Web应用开发:从私有化部署到功能扩展实战

1. 项目概述&#xff1a;一个基于ChatGPT的Web应用 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“ChatGPT-website”。光看名字&#xff0c;你可能会觉得这又是一个简单的ChatGPT网页版封装&#xff0c;但点进去仔细研究后&#xff0c;我发现它的定位和实现思路&#…

作者头像 李华
网站建设 2026/5/7 11:55:19

如何快速提取冒险岛游戏资源?WzComparerR2开源工具完整指南

如何快速提取冒险岛游戏资源&#xff1f;WzComparerR2开源工具完整指南 【免费下载链接】WzComparerR2 Maplestory online Extractor 项目地址: https://gitcode.com/gh_mirrors/wz/WzComparerR2 你是否曾经想提取冒险岛游戏中的精美图片、酷炫技能特效或完整地图场景&a…

作者头像 李华
网站建设 2026/5/7 11:55:10

3步搞定ComfyUI插件管理:高效AI绘画生态构建完整指南

3步搞定ComfyUI插件管理&#xff1a;高效AI绘画生态构建完整指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom…

作者头像 李华
网站建设 2026/5/7 11:54:19

如何在Windows上快速安装安卓应用:APK Installer完整实战指南

如何在Windows上快速安装安卓应用&#xff1a;APK Installer完整实战指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否厌倦了笨重的安卓模拟器&#xff1f;是…

作者头像 李华
网站建设 2026/5/7 11:49:41

主流相机航高与分辨率的对应关系

1、主要的知识点是相似三角形&#xff0c;像元大小μm/焦距mmGSDcm/航高m2、大疆P1像元4.4μm&#xff0c;焦距35mm&#xff0c;求得的航高参数为79.5m对应1cm&#xff0c;也就是说500米航高地面的分辨率为6.29cm3、大疆M3E像元3.3μm&#xff0c;焦距12mm&#xff0c;求得的航…

作者头像 李华