0

0

c++如何实现单例设计模式 _c++单例模式实现技巧

冰火之心

冰火之心

发布时间:2025-11-04 17:17:21

|

798人浏览过

|

来源于php中文网

原创

单例模式确保类唯一实例并提供全局访问。C++中常用局部静态变量实现(C++11线程安全),推荐此法因简洁高效;懒汉模式支持延迟初始化但需加锁防竞态;饿汉模式启动即创建,线程安全但可能浪费资源;智能指针可防内存泄漏,但多线程下仍需同步。优先选用局部静态变量方式。

c++如何实现单例设计模式 _c++单例模式实现技巧

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

懒汉模式(延迟初始化)

实例在第一次使用时才创建,适合启动开销较大的场景。

// 线程安全的懒汉模式(C++11 及以上)

static std::mutex mtx;

class Singleton {

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

private:

    Singleton() = default;

    Singleton(const Singleton&) = delete;

    Singleton& operator=(const Singleton&) = delete;

    static Singleton* instance;

public:

    static Singleton* getInstance() {

        if (instance == nullptr) {

            std::lock_guard<:mutex> lock(mtx);

            if (instance == nullptr) {

                instance = new Singleton();

            }

        }

        return instance;

    }

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

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

下载

};

Singleton* Singleton::instance = nullptr;

这种方式使用双重检查锁定减少锁竞争,C++11 起内存模型支持局部静态变量的线程安全,更推荐下面的方法。

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

C++11 标准保证局部静态变量的初始化是线程安全的,简洁且高效。

class Singleton {

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

private:

    Singleton() { }

    Singleton(const Singleton&) = delete;

    Singleton& operator=(const Singleton&) = delete;

public:

    static Singleton& getInstance() {

        static Singleton instance;

        return instance;

    }

};

调用 Singleton::getInstance() 即可获取唯一实例。析构由系统自动处理,无需手动释放。

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

在程序加载时就创建实例,避免运行时开销,适用于对启动时间不敏感的场景。

class Singleton {

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

private:

    Singleton();

    Singleton(const Singleton&) = delete;

    Singleton& operator=(const Singleton&) = delete;

    static Singleton instance;

public:

    static Singleton& getInstance() {

        return instance;

    }

};

Singleton Singleton::instance;

优点是绝对线程安全,缺点是可能提前占用资源。

智能指针管理生命周期(防内存泄漏)

若必须动态分配,可用 std::unique_ptr 管理实例,结合 atexit 或静态析构保证释放。

class Singleton {

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

private:

    Singleton();

    static std::unique_ptr instance;

public:

    static Singleton& getInstance() {

        if (!instance) {

            instance = std::make_unique();

        }

        return *instance;

    }

};

std::unique_ptr Singleton::instance = nullptr;

注意:仍需加锁处理多线程环境下的竞态条件。

基本上就这些。推荐优先使用局部静态变量方式,简洁、安全、高效。避免过度设计,除非有特殊需求如跨 DLL 共享实例或自定义销毁顺序。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

769

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

468

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

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

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

482

2023.08.10

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

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

143

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

11

2026.01.21

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.4万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.6万人学习

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

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