关于嵌入式里的动态内存分配,其实在真实项目里,这是个需要特别谨慎的事情。我简单说说我的理解,可能比较直接。
**核心就一句话:在嵌入式里,能不用动态分配(就是 malloc/new)就尽量别用。** 十个面试官有九个听到你用动态内存,可能都会先皱下眉头。
为什么呢?主要是因为它有两个嵌入式系统很怕的"毛病":
-
内存碎片:这是最头疼的。比如你反复地申请 1K、2K 然后又释放掉,但释放的顺序和申请的顺序不一样。时间一长,内存里就会剩下很多零零碎碎的小空档,看起来总内存还剩不少,但当你需要申请一块稍大的、连续的内存时,可能就死活申请不出来了。在要连续跑几个月几年的设备上,这就是个不定时炸弹。
-
时间不确定 :
malloc要去找一块合适的内存给你,这个找的时间是不固定的。万一你正在执行一个要求严格的实时控制任务,这时候来一下卡顿,后果可能很严重。
那不用动态内存,我们用什么?
一般来说,优先级是这样的:
-
静态分配是王道:启动的时候就把数组、缓冲区这些固定好,简单、安全、可预测。这是最受欢迎的。
-
用内存池 :如果实在需要"动态"的感觉(比如频繁创建/删除同一种任务或数据块),我们会在系统初始化时,就预先开辟好一大块内存,切成很多个固定大小的小块(这叫内存池)。需要的时候,从池子里拿一块;用完了,还回池子里。因为每块大小固定,就彻底避免了碎片,而且拿和还的速度都极快。
-
"分配不还":还有一种土办法,就是在系统初始化阶段,把所有可能需要的内存都一口气申请了,后面只使用,不释放。虽然听起来有点"浪费",但保证了系统长期运行的稳定。
那如果项目里非要用 malloc/free 呢?
如果因为某些原因(比如用了第三方库)必须用,那有几条"保命"原则:
-
一定要检查返回值 :
malloc后必须看是不是NULL,是的话你得有处理方案,不能当没事发生。 -
成对匹配 :
malloc和free一定要确保配对,别漏了,不然内存泄漏在嵌入式设备上基本是"绝症"。 -
划定范围:尽量在系统启动、初始化阶段集中申请,避免在复杂的业务逻辑里到处申请释放,不然很难管理和排查。
简单总结一下 :跟面试官聊这个,核心思想就是表达出你对嵌入式资源有限和可靠性要求高的深刻认识。你知道动态内存的原理,但更知道在嵌入式环境里它的风险。所以你的第一选择永远是静态分配或者内存池这类更可控的方案。这能体现出你的工程素养是贴合嵌入式开发特点的,不是只会套用电脑上的编程习惯。
更多嵌入式面试题 <<<