目录
✅ 关键点说明:
❌ 不推荐的旧写法(双重检查锁定 动态分配)
常见用途
首页 后端开发 C++ C Singleton模式示例

C Singleton模式示例

Aug 06, 2025 pm 01:20 PM
c++

单例模式确保一个类只有一个实例并提供全局访问点,C 11推荐使用局部静态变量实现线程安全的懒加载单例。1. 利用函数内静态变量的线程安全初始化和延迟构造;2. 删除拷贝构造和赋值操作防止复制;3. 私有化构造和析构函数确保外部无法直接创建或销毁;4. 静态变量在程序退出时自动析构,无需手动管理资源。该写法简洁可靠,适用于日志器、配置管理、数据库连接池等场景,是C 11及以上标准下首选的单例实现方式。

C   singleton pattern example

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

C   singleton pattern example

下面是一个线程安全、懒加载、C 11 及以上标准推荐写法的单例模式示例:

#include <iostream>

class Singleton {
public:
    // 获取单例实例(C  11 起,局部静态变量初始化是线程安全的)
    static Singleton& getInstance() {
        static Singleton instance;  // 局部静态变量,延迟初始化,且线程安全
        return instance;
    }

    // 删除拷贝构造和赋值操作,防止意外复制
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    // 提供一个简单的功能函数用于测试
    void doSomething() {
        std::cout << "Singleton is doing something." << std::endl;
    }

private:
    // 私有构造函数和析构函数
    Singleton() {
        std::cout << "Singleton constructed." << std::endl;
    }

    ~Singleton() {
        std::cout << "Singleton destroyed." << std::endl;
    }
};

// 使用示例
int main() {
    // 获取单例实例
    Singleton& s1 = Singleton::getInstance();
    Singleton& s2 = Singleton::getInstance();

    // 验证是否为同一个实例
    if (&s1 == &s2) {
        std::cout << "s1 and s2 are the same instance." << std::endl;
    }

    s1.doSomething();

    return 0;
}

✅ 关键点说明:

1. 线程安全的懒加载

  • C 11 起,函数内的局部静态变量初始化是线程安全的(由编译器保证)。
  • static Singleton instance; 只会在第一次调用 getInstance() 时构造,之后直接返回。

2. 禁止拷贝

  • 使用 delete 禁止拷贝构造和赋值,防止外部复制实例。

3. 构造/析构私有

  • 确保外部无法直接创建或销毁对象。

4. 自动析构

  • 局部静态变量会在程序退出时自动调用析构函数,无需手动管理。

❌ 不推荐的旧写法(双重检查锁定 动态分配)

在 C 03 或多线程环境下手动实现时,有人用 new mutex,但容易出错。C 11 之后推荐使用上面的“Meyers Singleton”写法(由 Scott Meyers 推广),简洁且安全。

C   singleton pattern example

常见用途

  • 日志记录器(Logger)
  • 配置管理器
  • 数据库连接池
  • 线程池

基本上就这些。只要你的编译器支持 C 11,这种写法是最简单可靠的单例实现方式。

以上是C Singleton模式示例的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

Rimworld Odyssey温度指南和Gravtech
1 个月前 By Jack chen
初学者的Rimworld指南:奥德赛
1 个月前 By Jack chen
PHP变量范围解释了
4 周前 By 百草
撰写PHP评论的提示
3 周前 By 百草
在PHP中评论代码
3 周前 By 百草

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1604
29
PHP教程
1509
276
C char数组到字符串示例 C char数组到字符串示例 Aug 02, 2025 am 05:52 AM

答案是:使用std::string构造函数可将char数组转换为std::string,若数组含中间'\0'则需指定长度。1.对于以'\0'结尾的C风格字符串,直接用std::stringstr(charArray);即可完成转换;2.若char数组包含中间'\0'但需转换前N个字符,应使用std::stringstr(charArray,length);明确指定长度;3.处理固定大小数组时确保其以'\0'结尾再转换;4.可用str.assign(charArray,charArray strl

Succinct(PROVE币)是什么?如何运作?PROVE代币经济与价格预测 Succinct(PROVE币)是什么?如何运作?PROVE代币经济与价格预测 Aug 06, 2025 pm 06:42 PM

目录什么是Succinct(PROVE)谁创建了Succinct(PROVE)?哪些风险投资支持Succinct(PROVE)?Succinct(PROVE)的工作原理SP1zkVM和Prover网络OPSuccinct技术跨链验证PROVE代币经济学代币详情代币分配代币实用程序潜在代币持有者PROVE代币价格预测PROVE代币的上市前交易活动社区对PROVE代币价格的预测为什么要选择Succinct?Succ

C在矢量示例中查找 C在矢量示例中查找 Aug 02, 2025 am 08:40 AM

在C 中查找vector元素最常用的方法是使用std::find,1.使用std::find配合迭代器范围和目标值进行查找,通过比较返回的迭代器是否等于end()来判断是否找到;2.对于自定义类型或复杂条件,应使用std::find_if并传入谓词函数或lambda表达式;3.查找字符串等标准类型时直接传入目标字符串即可;4.每次查找时间复杂度为O(n),适用于小规模数据,频繁查找应考虑使用std::set或std::unordered_set,该方法简单有效且广泛适用于各类查找场景。

迭代时从矢量擦除 迭代时从矢量擦除 Aug 05, 2025 am 09:16 AM

删除元素时若正在迭代,必须避免使用失效迭代器。①正确做法是使用it=vec.erase(it),利用erase返回的有效迭代器继续遍历;②批量删除推荐“erase-remove”惯用法:vec.erase(std::remove_if(vec.begin(),vec.end(),条件),vec.end()),安全且高效;③可使用反向迭代器从后往前删除,逻辑清晰但需注意条件方向。结论:始终用erase返回值更新迭代器,禁止对已失效迭代器执行 操作,否则导致未定义行为。

什么是正确的启动。用于在Linux上使用GDB调试C应用程序的JSON设置? 什么是正确的启动。用于在Linux上使用GDB调试C应用程序的JSON设置? Aug 04, 2025 am 03:46 AM

todebugac Application usinggdbinvisualStudiocode,configureTheLaunch.jsonFileCortly; keySettingSincludEsTeScifiewingTheexecutableWithWith program“ program”,将“ mimode”设置为“ gdb”和“ gdb”和“ type” type“ type” to type“ to” type to ty ty'cppdbg

c Mutex示例 c Mutex示例 Aug 03, 2025 am 08:43 AM

std::mutex用于保护共享资源以防止数据竞争,示例中通过std::lock_guard自动加锁和解锁确保多线程安全;1.使用std::mutex和std::lock_guard可避免手动管理锁带来的异常风险;2.共享变量如计数器在多线程修改时必须用互斥量保护;3.推荐RAII风格的锁管理以确保异常安全;4.避免死锁需按固定顺序获取多个锁;5.任何多线程访问共享资源场景都应使用互斥量同步,最终程序正确输出Expected:10000和Actual:10000。

C自动关键字示例 C自动关键字示例 Aug 05, 2025 am 08:58 AM

theAutokeywordInc decteStheTypeOfavariable fromitsInitializer,makecodecleanerandmoraintableable.1.itredreducesverbosity,尤其是withcomplextypeslikeiterators.2.itenhancesmaintainabilitionalobilitybyautaperaimatoragationalaimatoragationalapationalabilationalabilationalapationalapationalabilabilationalabilationalapationalabilationalapationalablemaintartaptingtopypechanges.3.ithicalemenderarefornelect

C标签调度示例 C标签调度示例 Aug 05, 2025 am 05:30 AM

TagDispatching通过类型标签在编译期选择最优函数重载,实现高效多态。1.使用std::iterator_traits获取迭代器类别标签;2.定义多个do_advance重载函数,分别处理random_access_iterator_tag、bidirectional_iterator_tag和input_iterator_tag;3.主函数my_advance根据推导出的标签类型调用对应版本,确保编译期决策无运行时开销;4.该技术被标准库如std::advance采用,支持扩展自定义

See all articles