您的教授提出了一个重要的观点。不幸的是,英语用法是如此,我不能完全确定他们说的是什么。让我用具有某些内存使用特性并且与我个人合作过的非玩具程序来回答这个问题。
一些程序表现良好。它们以波浪的形式分配内存:在重复周期中,大量的中小型分配,然后是大量的释放。在这些程序中,典型的内存分配器运行良好。它们合并释放的块,并且在一波结束时,大多数空闲内存都位于大的连续块中。这些程序很少见。
大多数程序表现不佳。它们或多或少随机地分配和释放内存,大小从非常小到非常大,并且保留了分配块的高使用率。在这些程序中,合并块的能力受到限制,并且随着时间的流逝,它们最终会以高度分散且相对不连续的内存来完成。如果一个32位内存空间中的总内存使用量超过了1.5GB,并且分配了(例如)10MB或更多,最终大分配之一将失败。这些程序很常见。
其他程序释放很少或没有内存,直到它们停止。它们在运行时逐步分配内存,仅释放少量内存,然后停止,这时将释放所有内存。编译器就是这样。VM也是如此。例如,.NET CLR运行时本身用C ++编写,可能永远不会释放任何内存。为什么要这样
这就是最终答案。在程序占用大量内存的情况下,使用malloc和free管理内存不足以解决问题。除非您有幸处理一个性能良好的程序,否则您将需要设计一个或多个自定义内存分配器,这些分配器预先分配大块内存,然后根据您选择的策略进行子分配。您可能根本无法使用免费,除非程序停止运行。
不知道您的教授到底怎么说,对于真正的生产规模计划,我可能会站在他们一边。
编辑
我将一口气回答一些批评。显然,SO不是此类职位的好地方。需要明确说明的是:我有大约30年的编写此类软件的经验,其中包括一些编译器。我没有学术参考,只有我自己的瘀伤。我忍不住觉得批评来自经验狭窄和经验短的人。
我会重复我的关键信息:平衡malloc和free是不足够的解决方案的大型存储器分配在实际程序。块合并是正常的,并且会花费时间,但是这还不够。您需要认真,聪明的内存分配器,它们倾向于以块(使用malloc或其他方式)抢占内存,并且很少释放内存。这可能是OP的教授们想起的信息,他对此误解了。