
1. 从一次代码评审说起为什么嵌入式圈对malloc如此警惕几年前我参与过一个机载设备的软件评审代码逻辑写得挺漂亮架构分层也清晰但评审到一半一位做了二十多年航空软件的老工程师指着一段malloc调用说了一句话“这段代码飞控计算机上不了。”当时写代码的年轻人有点不服气觉得内存不够就动态申请用完释放这不是教科书上教的吗老工程师没多解释只让我们回去查三件事堆碎片在长时间运行后会发生什么、内存分配失败时系统怎么处理、以及最坏执行时间怎么证明。这三个问题基本就把动态内存分配在安全关键系统里的命运判了死刑。这篇内容我想把这件事掰开揉碎讲清楚——不是泛泛地说“动态内存危险”而是从内存布局、碎片机理、实时性约束、认证标准这几个维度把“为什么严禁”背后的工程逻辑讲透。如果你在做嵌入式、汽车电子、工业控制、航空航天这类对可靠性要求极高的系统或者你只是好奇“写个业务代码天天new来new去怎么到了导弹上就不行了”这篇都值得看完。需要先说明一点这里的“导弹写代码”是一个泛指代表的是安全关键实时嵌入式系统这一类场景。它的核心特征有三个——不能死机、响应时间必须可预测、出了问题要能追溯到原因。动态内存分配恰恰在这三点上都埋着雷。下面我按“先讲清楚机制再讲清楚后果最后讲清楚替代方案”的顺序展开。2. 动态内存分配到底在运行时做了什么2.1 malloc/free和new/delete的本质差异很多人把malloc/free和new/delete混为一谈觉得都是“申请内存、释放内存”。在讨论安全关键系统之前有必要先把这两组东西的底层行为理清楚因为它们的风险点并不完全一样。malloc是C标准库提供的内存分配函数它做的事情是在堆区找一块足够大的空闲内存块返回首地址并把这