0

0

c++中怎么实现单例模式_c++单例设计模式实现方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-10 18:14:02

|

684人浏览过

|

来源于php中文网

原创

单例模式通过私有构造函数、禁止拷贝和全局访问点确保类唯一实例。1. 懒汉模式延迟初始化,需加锁保证线程安全;2. 饿汉模式启动时创建,天然线程安全但可能浪费资源;3. 局部静态变量法(C++11)最推荐,兼具懒加载、线程安全与自动析构;4. 注意禁用拷贝、避免内存泄漏及析构顺序问题。

c++中怎么实现单例模式_c++单例设计模式实现方法

单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式,关键在于控制构造函数的访问、禁止拷贝,并保证线程安全和资源释放。以下是几种常见的实现方式。

1. 懒汉模式(延迟初始化)

懒汉模式在第一次使用时才创建实例,适合实例创建开销大或不一定用到的场景。

基础版本(非线程安全):

class Singleton {
private:
    static Singleton* instance;
    Singleton() {}  // 私有构造函数

public: static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; } };

Singleton* Singleton::instance = nullptr;

立即学习C++免费学习笔记(深入)”;

多线程环境下可能多个线程同时进入判断,导致多次创建。改进为线程安全版本:

#include 

class Singleton { private: static Singleton* instance; static std::mutex mtx; Singleton() {}

public: static Singleton* getInstance() { std::lock_guard lock(mtx); if (instance == nullptr) { instance = new Singleton(); } return instance; } };

Singleton* Singleton::instance = nullptr; std::mutex Singleton::mtx;

2. 饿汉模式(程序启动时初始化)

饿汉模式在程序启动时就创建实例,天然线程安全,但可能浪费资源。

class Singleton {
private:
    static Singleton instance;
    Singleton() {}

public: static Singleton& getInstance() { return instance; } };

Singleton Singleton::instance; // 全局初始化

响应式黑色展台设计整站模板1.4.2
响应式黑色展台设计整站模板1.4.2

响应式黑色展台设计整站模板,自带内核安装即用,图片文本实现可视化,方便修改,支持多种内容模型及自定义功能,可根据需要自行添加。模板特点: 1、安装即用,自带人人站CMS内核及企业站展示功能(产品,新闻,案例展示等),并可根据需要增加表单 搜索等功能(自带模板) 2、支持响应式 3、前端banner轮播图文本均已进行可视化配置 4、伪静态页面生成 5、支持内容模型、多语言、自定义表单、筛选、多条件搜

下载

由于静态成员在程序加载时完成初始化,不存在多线程竞争问题,简单可靠。

3. 局部静态变量(推荐写法)

C++11起,局部静态变量的初始化是线程安全的,这是最简洁且高效的实现方式。

class Singleton {
private:
    Singleton() {}

public: static Singleton& getInstance() { static Singleton instance; // 局部静态变量 return instance; }

// 禁止拷贝
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

这种方式兼具懒加载、线程安全、自动析构的优点,无需手动管理内存,也不依赖外部锁。

4. 注意事项

无论哪种实现,都需注意以下几点:

  • 禁用拷贝构造和赋值操作:防止意外复制实例。
  • 避免内存泄漏:使用智能指针或依赖对象生命周期管理。
  • 析构顺序问题:若单例依赖其他全局对象,需注意析构顺序。

基本上就这些。推荐使用局部静态变量的方式,代码简洁,线程安全,现代C++标准支持良好。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

359

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

558

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

462

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1

2025.12.24

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

84

2025.12.24

俄罗斯搜索引擎yandex官方入口地址(最新版)
俄罗斯搜索引擎yandex官方入口地址(最新版)

Yandex官方入口网址是https://yandex.com。用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

553

2025.12.24

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

155

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

20

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号