商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++单例模式实现详解

C++单例模式实现详解

  发布于2025-09-28 阅读(0)

扫一扫,手机访问

单例模式通过私有构造函数、静态实例和全局访问点确保类唯一实例。1. 懒汉模式延迟初始化,需加锁保证线程安全;2. 饿汉模式程序启动即创建,线程安全但可能浪费资源;3. 局部静态变量法(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;

上述版本在多线程环境下不安全。加锁后线程安全版本:

#include <mutex>

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

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

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

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

实例在程序启动时就创建,无需考虑多线程问题。

特点: 线程安全,但可能浪费资源。

实现方式:

class Singleton {
private:
    Singleton() {}
    static Singleton instance;  // 静态成员变量

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

// 定义静态成员 Singleton Singleton::instance;

由于静态变量在程序启动时初始化,天然线程安全,适用于对象创建开销小且一定会使用的场景。

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

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

class Singleton {
private:
    Singleton() {}
    ~Singleton() {}

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

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

};

优点: 自动管理生命周期,线程安全,代码简洁。

利用了“局部静态变量只初始化一次”的特性,编译器保证线程安全,无需手动加锁。

注意事项

  • 禁止拷贝和赋值操作,防止意外复制实例。
  • 注意析构顺序,若单例依赖其他全局对象,可能引发未定义行为。
  • 避免频繁调用 getInstance() 影响性能,可缓存指针引用。

基本上就这些。局部静态变量方式是最推荐的现代C++单例实现。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。
  • centos查看python版本_CentOS系统python默认版本由python2改为python3 正版软件
    centos查看python版本_CentOS系统python默认版本由python2改为python3
    一、了解现状:CentOS中的Python环境 在CentOS系统中,如果已经安装了yum,那么系统中通常已经存在某个版本的Python 2。在命令行中直接输入python命令,你大概率会看到Python 2的环境被唤醒: [root@instance-hrnebyqu src]# python P
    3分钟前 0
  • c++如何计算文件的MD5哈希值_分块读取与加密库结合【实战】 正版软件
    c++如何计算文件的MD5哈希值_分块读取与加密库结合【实战】
    如何用C++稳健地计算大文件的MD5哈希值? 直接使用 std::ifstream 将整个文件读入内存再计算MD5,对于大文件(例如超过1GB)来说,无异于一场“内存灾难”——要么内存溢出,要么直接触发系统的OOM杀手。稳妥的做法,必须是分块读取文件,并配合加密库进行增量哈希更新。 加密库选择:为何
    3分钟前 0
  • C++ std::assume_aligned _ C++20编译器指针对齐优化【详解】 正版软件
    C++ std::assume_aligned _ C++20编译器指针对齐优化【详解】
    std::assume_aligned:一份与编译器的“对齐契约”,用错后果很严重 先明确一个核心概念:std::assume_aligned 不是用来“让”指针对齐的魔法函数,而是你向编译器做出的一份“保证声明”——“我发誓,这个指针已经对齐好了”。 一旦这份保证是假的,未定义行为(UB)就会找上
    4分钟前 0
  • PHP函数如何适配边缘计算硬件设备_PHP在工业级硬件部署【教程】 正版软件
    PHP函数如何适配边缘计算硬件设备_PHP在工业级硬件部署【教程】
    PHP函数如何适配边缘计算硬件设备:工业级硬件部署实战指南 将PHP部署到边缘计算硬件上,常会遇到一个根本性的矛盾:PHP并非为裸金属或资源高度受限的嵌入式环境而生。直接移植,往往会遭遇启动失败、内存溢出或定时器失准等问题——这通常不是简单的配置错误,而是其运行时模型与底层硬件环境不匹配导致的必然结
    5分钟前 0
  • C++如何自定义cout的输出格式 _ 操纵符(Manipulator)实现【实战】 正版软件
    C++如何自定义cout的输出格式 _ 操纵符(Manipulator)实现【实战】
    C++如何自定义cout的输出格式 | 操纵符(Manipulator)实现【实战】 什么是操纵符,为什么不能直接用cout就完事? 很多初学者会问,既然cout能输出,为什么还要搞出hex、setw这些“操纵符”来多此一举?这恰恰是理解C++流式输出的关键一步。 简单来说,操纵符(Manipula
    5分钟前 0

热门关注