news 2026/10/13 12:30:16

C++单例模式 (Singleton Pattern)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++单例模式 (Singleton Pattern)

单例模式 (Singleton Pattern)是软件设计模式中最基础、也是自动驾驶系统中最常用的一种模式。

为了让你彻底理解,我们还是用生活例子,结合代码来拆解。


一、 核心概念:

单例模式的定义:确保一个类只有一个实例 (Instance),并提供一个全局访问点来获取它。

生活中的例子:
  • 公司公章:只有一枚。谁要盖章,都得去找那一枚章。

代码中的含义:

在你的代码里,PlanContext就是那个“公章”。

  • 错误的做法:每次要用数据,就new PlanContext()。

    • 后果:感知模块往“公章A”里写了障碍物,规划模块去“公章B”里读数据。结果读了个寂寞,车子撞墙。

  • 单例的做法:全程序禁止new,只能通过一个特定的函数(比如Instance())拿到那唯一的一个对象。


二、 C++ 代码怎么写?

这是 C++11 之后最标准、最简洁、线程安全的写法(被称为Meyers' Singleton)。请把这段代码刻在脑子里:

class PlanContext { private: // 1. 构造函数私有化 (Private Constructor) // 意思:禁止外部随便 new!只有我自己能生我自己。 PlanContext() { std::cout << "PlanContext 初始化了(只会出现一次)" << std::endl; } public: // 2. 删除拷贝构造和赋值操作 (Delete Copy) // 意思:禁止克隆!禁止影分身!保证独一无二。 PlanContext(const PlanContext&) = delete; void operator=(const PlanContext&) = delete; // 3. 全局访问点 (Global Access Point) // 意思:想要用我?调这个函数。 static PlanContext& Instance() { // 关键点:static 局部变量 // 特性:C++11 保证了它是线程安全的,且只会初始化一次 static PlanContext instance; return instance; } // --- 具体的业务数据 --- void updateData() { ... } }; // 使用方法: int main() { // PlanContext p = new PlanContext(); // 报错!不让你 new // 正确用法:直接找 Instance 要 PlanContext::Instance().updateData(); }

三、 为什么PlanContext必须是单例?

结合你的架构图,原因有两个:

1. 数据一致性 (Data Consistency)

你的系统是一个流水线:感知 -> 写入 -> PlanContext -> 读取 -> 规划如果PlanContext不是单例,感知写到了对象 A,规划读的是对象 B,那规划模块永远拿不到最新的路况。只有大家共用一个对象,才能保证**“你写的就是我读的”**。

2. 节省资源 (Resource Management)

虽然PlanContext可能不大,但如果是一些像MapEngine(地图引擎)这样的类,加载一次地图要吃掉 2GB 内存。如果你不小心new了 10 次,20GB 内存没了,电脑直接死机。单例保证了它只占一份内存。


四、 单例模式的“坑”

虽然它好用,但也不要滥用。

  1. 它本质上是全局变量: 因为谁都能访问它,谁都能改它。如果代码里哪个角落偷偷改了数据,很难查出来是谁干的。(所以我们要加Mutex锁来保护)。

  2. 生命周期难以控制: 它通常在程序启动时出生,程序结束时销毁。如果你想中途把它销毁释放内存,比较麻烦。

五、 总结

当你看到代码里写着::Instance()或者::getInstance()时,脑子里要立刻反应过来:

  1. 这是一个单例。

  2. 全公司只有这一份。

  3. 大家都在抢着用它,所以里面肯定有锁 (Mutex)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 11:03:32

书单之自动驾驶感知实践:从3D到BEV

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 书单之自动驾驶感知实践&#xff1a;从3D到BEV引言&#xff1a;BEV感知的技术本质与工程挑战01 BE…

作者头像 李华
网站建设 2026/10/7 12:46:39

打卡信奥刷题(2756)用C++实现信奥题 P3719 [AHOI2017初中组] rexp

P3719 [AHOI2017初中组] rexp 题目背景 为了解决形形色色的字符串匹配问题&#xff0c;正则表达式是一个强有力的工具。正则表达式通过定义一套符号体系&#xff0c;能够表示出需要查找的字符串所具有的性质。如 a|aa 能匹配 a 或 aa&#xff0c;(a|b)c 能匹配 ac 或 bc。 题…

作者头像 李华
网站建设 2026/10/11 9:45:25

跟单高手:用数据化跟进,让客户复购率翻倍

很多销售人员觉得“只要勤奋地和客户保持联系&#xff0c;就能够获得高复购率”&#xff0c;于是在节日的时候送上问候&#xff0c;不断地推送产品信息&#xff0c;然而效果却微乎其微&#xff0c;真正高效的跟单&#xff0c;依靠的并不是嘴勤&#xff0c;而是以数据作为驱动&a…

作者头像 李华
网站建设 2026/10/11 9:45:31

基于单片机 PID 算法的温度控制调节器控制设计

一、系统整体设计方案 本系统以 STM32F103C8T6 单片机为控制核心&#xff0c;融合 PID&#xff08;比例 - 积分 - 微分&#xff09;算法实现高精度温度控制&#xff0c;适用于工业加热设备、恒温水箱、实验室反应釜等场景&#xff0c;可实现目标温度设定&#xff08;0-100℃&a…

作者头像 李华
网站建设 2026/10/12 2:22:20

基于Simulink的电机轴承润滑优化仿真

目录 手把手教你学Simulink 一、引言:为什么“电机温升不高,但轴承却干磨烧毁”?——润滑失效是可靠性黑洞! 二、轴承润滑失效机理:从油脂到卡死的退化链 润滑脂功能三要素: 失效路径: 关键指标: 三、应用场景:电动汽车驱动电机的长寿命轴承设计 系统需求 四…

作者头像 李华