当前位置: 首页 > news >正文

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)。

http://www.jsqmd.com/news/308743/

相关文章:

  • svd在图像处理中的应用
  • 【完全复现】含可再生能源和储能的区域微电网的最优运行(考虑鲁棒性和不确定性)【多阶段鲁棒调度模型】附Matlab代码
  • 书单之自动驾驶感知实践:从3D到BEV
  • Vue组件开发:直接写法 vs 数据驱动,该怎么选?
  • 告别网盘限制!群晖 NAS部署 Copyparty,轻松搞定文件共享与远程访问
  • Gmail养号指南:如何维稳防封?
  • 传输标准:助力集成商为客户交付集团专网质量达标方案
  • 冗余标准:支撑运维商为客户交付全链路交换冗余保障方案
  • 运行指标:支撑IT外包公司为客户交付资源使用率监测方案
  • 系统巡检:助力设备商为客户交付统一配置升级服务方案
  • 35岁程序员转型AI攻略:为什么说现在学习大模型正是黄金时期?附必收藏学习资源
  • 运维分析:支撑运维商为客户交付局域网深度诊断方案
  • AI大模型时代的5大黄金岗位,年轻人的职业规划指南_适合年轻人就业新型岗位大盘点
  • d3dx10d_43.dll文件丢失找不到情况 免费下载方法分享
  • 意向性注入:Skill如何让AI真正“学会“你的工作方式(程序员必看,收藏级干货)
  • 大模型与VLA在自动驾驶中的应用:技术解析与高薪岗位指南
  • 大模型入门到精通:行业职位细分与领域详解,建议收藏,一文理清大模型行业细分与职位细分
  • 让大模型“动“起来!智能体AI的4大适应范式详解,程序员必备收藏
  • 蒙油加油站品牌运营商
  • 你的算力被浪费了!警惕GPU热节流这一“隐形杀手”
  • 民营加油站品牌推荐
  • Selenium 绕过 Cloudflare 反爬检测
  • Selenium 性能优化:减少显式等待时间
  • 民营加油站品牌
  • 2026年四川颗粒生产线厂家权威推荐:东宏机械领跑绿色智造新时代
  • 通辽市省道加油站
  • 敏感肌用什么产品美白效果比较好?力荐这瓶把温和提亮“焊在脸上”的科技霜
  • T/ACCEM 700-2025标准
  • 2026毕设ssm+vue驴友社交管理系统论文+程序
  • 国道司机推荐加油站