0

0

c++如何实现单例模式 设计模式在c++中的应用【进阶必看】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-18 12:21:07

|

624人浏览过

|

来源于php中文网

原创

C++单例模式推荐使用C++11局部静态变量实现,线程安全且懒加载;需传参或控制销毁时机时用指针+双重检查锁;模板化CRTP基类可复用,但不支持参数构造;避免老式懒汉、饿汉及宏实现。

c++如何实现单例模式 设计模式在c++中的应用【进阶必看】

单例模式在 C++ 中的核心目标是:确保一个类只有一个实例,并提供全局访问点。关键难点在于线程安全、懒加载、析构时机和模板复用。下面从实用角度讲清几种主流实现方式及其适用场景。

最简线程安全的懒汉式(C++11 及以后)

C++11 标准保证了 局部静态变量的初始化是线程安全的,这是最推荐的现代写法,无需手动加锁,也天然支持懒加载:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 仅首次调用时构造,且线程安全
        return instance;
    }
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

private: Singleton() = default; // 构造函数私有 ~Singleton() = default; // 析构函数私有(可选,若需控制销毁时机则留 public) };

✅ 优点:简洁、安全、高效、自动管理生命周期
⚠️ 注意:析构发生在 main() 返回后、全局对象销毁阶段;若其他静态对象依赖该单例,可能引发“静态析构顺序问题”。

带显式初始化控制的单例(适用于需延迟构造参数或避免静态析构风险)

当单例构造需要运行时参数,或你希望完全掌控创建/销毁时机(比如游戏引擎中模块按需启停),可用指针 + 懒加载 + 手动管理:

class ConfigManager {
public:
    static ConfigManager& getInstance() {
        if (!instance) {
            std::lock_guard lock(mutex_);
            if (!instance) {
                instance = new ConfigManager("config.json");
            }
        }
        return *instance;
    }
static void destroy() {
    std::lock_guard lock(mutex_);
    delete instance;
    instance = nullptr;
}

private: ConfigManager(const std::string& cfgPath) { / 加载配置 / } ~ConfigManager() = default;

static ConfigManager* instance;
static std::mutex mutex_;

};

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

ToonMe
ToonMe

一款风靡Instagram的软件,一键生成卡通头像

下载

ConfigManager* ConfigManager::instance = nullptr; std::mutex ConfigManager::mutex_;

✅ 优点:可传参、可主动销毁、规避静态析构顺序问题
⚠️ 注意:必须确保 destroy() 在所有使用方之后调用;多线程下双重检查锁(Double-Checked Locking)需配合 std::atomic 或确保编译器不重排(C++11 起该写法已安全)。

模板化通用单例基类(减少重复代码)

为多个类快速添加单例能力,可设计 CRTP(Curiously Recurring Template Pattern)风格基类:

template
class SingletonBase {
protected:
    SingletonBase() = default;
    ~SingletonBase() = default;

public: SingletonBase(const SingletonBase&) = delete; SingletonBase& operator=(const SingletonBase&) = delete;

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

};

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

// 使用方式: class Logger : public SingletonBase { friend class SingletonBase; Logger() = default; public: void log(const std::string& msg) { / ... / } };

✅ 优点:一行继承即获得单例能力,类型安全,无宏污染
⚠️ 注意:子类构造/析构函数需设为 protected,并通过 friend 放行基类访问;不适用于需要参数构造的场景(可扩展为带参数的变体)。

不推荐但需了解的写法

  • 老式懒汉式(全局锁 + 静态指针):C++03 常见,但易出竞态、易忘 delete、易内存泄漏;C++11 后已无必要。
  • 饿汉式(全局静态对象):启动即构造,线程安全但不懒加载,且无法控制构造顺序,还可能触发“静态初始化顺序 fiasco”。
  • 宏实现单例:破坏封装、调试困难、模板不友好,现代 C++ 应避免。

单例不是银弹——滥用会导致隐式依赖、难以测试、妨碍模块解耦。真正需要全局唯一状态时再用,优先考虑依赖注入或作用域明确的局部对象。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

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

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

524

2023.09.20

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

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

53

2025.08.29

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

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

99

2025.10.23

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

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

175

2023.11.23

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

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

97

2025.11.27

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

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

465

2024.01.03

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

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

13

2025.12.06

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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