0

0

c++中如何实现单例模式_C++设计模式之单例模式实现详解

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-09-21 11:21:01

|

245人浏览过

|

来源于php中文网

原创

单例模式确保类唯一实例并提供全局访问点,C++中常用懒汉、饿汉和局部静态变量三种实现方式。1. 懒汉模式延迟初始化但需加锁保证线程安全;2. 饿汉模式程序启动即创建实例,线程安全但可能浪费资源;3. 局部静态变量法自C++11起线程安全,代码简洁且支持延迟初始化,为推荐写法。使用时需注意构造函数不调用虚函数、避免继承、合理管理生命周期及析构顺序问题,建议优先采用局部静态变量实现。

c++中如何实现单例模式_c++设计模式之单例模式实现详解

单例模式是一种常用的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式需要注意线程安全、构造顺序和资源释放等问题。下面介绍几种常见的实现方式。

懒汉模式(Lazy Initialization)

懒汉模式在第一次使用时才创建实例,适合初始化开销较大的情况。

// 基础懒汉模式(非线程安全)

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

这种方式在多线程环境下可能创建多个实例,因此需要加锁保证线程安全。

// 线程安全的懒汉模式(使用互斥锁)

#include
class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;
    Singleton() {}
public:
    static Singleton* getInstance() {
        std::lock_guard<:mutex> lock(mtx);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

饿汉模式(Eager Initialization)

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

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

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、支持内容模型、多语言、自定义表单、筛选、多条件搜

下载

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

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

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

这种写法自动保证线程安全,代码简洁,延迟初始化,无需手动管理内存。

注意事项与优化

使用单例模式时需注意以下几点:

  • 避免在构造函数中调用虚函数,可能导致未定义行为
  • 考虑是否需要支持继承,单例通常不设计为基类
  • 若使用指针形式,应提供销毁接口或使用智能指针管理生命周期
  • 在程序结束时若仍有单例对象被引用,需防止析构顺序问题

对于需要显式释放资源的情况,可增加 release 方法:

static void release() {
    if (instance != nullptr) {
        delete instance;
        instance = nullptr;
    }
}

基本上就这些。局部静态变量的方式是最推荐的现代C++实现方法,简洁且安全。

相关专题

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

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

713

2023.08.22

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2023.11.23

java中void的含义
java中void的含义

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

93

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

994

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

53

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

243

2025.12.29

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

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

459

2024.01.03

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

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

7

2025.12.06

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

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

精品课程

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

共94课时 | 5.8万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.8万人学习

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

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