0

0

c++中怎么实现一个单例模式_C++单例模式设计与实现指南

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-09 09:56:02

|

140人浏览过

|

来源于php中文网

原创

单例模式确保类唯一实例并提供全局访问点,C++中常用局部静态变量实现(C++11起线程安全),推荐该方式因其简洁且自动管理生命周期,避免手动释放与多线程问题。

c++中怎么实现一个单例模式_c++单例模式设计与实现指南

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

懒汉模式(基础版)

懒汉模式在第一次使用时才创建实例。

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<:mutex> lock(mtx);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

虽然线程安全,但每次调用都加锁影响性能。可以结合双重检查锁定优化。

双重检查锁定(Double-Checked Locking)

减少锁的开销,仅在初始化时加锁。

Copilot
Copilot

Copilot是由微软公司开发的一款AI生产力工具,旨在通过先进的人工智能技术,帮助用户快速完成各种任务,提升工作效率。

下载
static Singleton* getInstance() {
    if (instance == nullptr) {
        std::lock_guard<:mutex> lock(mtx);
        if (instance == nullptr) {
            instance = new Singleton();
        }
    }
    return instance;
}

注意:需要确保指针赋值是原子操作,C++11之后支持原子指针可进一步增强安全性。

饿汉模式(推荐简单场景)

在程序启动时就创建实例,天然线程安全。

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

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

优点是简单且线程安全,缺点是无法延迟加载,可能浪费资源。

局部静态变量(C++11 起推荐)

利用函数内静态变量的特性,最简洁且线程安全。

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

C++11标准规定局部静态变量的初始化是线程安全的。这种方式自动管理生命周期,无需手动释放,代码简洁可靠。

注意事项与建议

  • 避免在构造函数中抛出异常,可能导致未定义行为
  • 考虑是否需要支持继承,一般单例不应被继承
  • 如果使用指针形式,需手动管理内存或使用智能指针
  • 频繁调用的单例建议使用饿汉或局部静态变量方式
  • 避免在多线程环境中销毁单例,除非明确控制生命周期

基本上就这些。对于大多数现代C++项目,推荐使用局部静态变量实现单例,既简洁又安全。

相关专题

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

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

711

2023.08.22

c++怎么把double转成int
c++怎么把double转成int

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

48

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

94

2025.10.23

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

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

455

2024.01.03

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

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

6

2025.12.06

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

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

467

2023.08.10

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

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

106

2025.12.24

excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

24

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

74

2025.12.29

热门下载

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

精品课程

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

共94课时 | 5.6万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.5万人学习

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

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