int main()
{
char *a = malloc(1024);
return 0;
}
上面的程序有内存泄漏吗?请提供尽可能完整和技术性的答案。
简单的答案是肯定的。操作系统正在为您整理
编辑
为了 gg.kaspersky 的利益。
当程序结束时,您应该已经整理了堆。它表示您已经考虑了所有分配并提供了这些资源的释放(对于打开的文件或其他操作系统资源可以说是正确的)。
这对你来说够复杂吗?
顺便说一句 - 访问家庭 (OS) 时保持与到达时相同的状态是一种礼貌。
程序本身有泄漏。操作系统是否清除它是另一回事。我想最好问'这个程序可能会导致任何系统出现问题吗?答案是肯定的。
C标准没有说分配的内存malloc
将在程序终止时释放,无论是正常还是异常。将其与打开的文件进行比较,如果程序正常终止,C 实现会保证为您关闭这些文件。
我不会认为这是内存泄漏。退出时仍可通过仍在作用域内的变量访问内存。
在程序结束时释放你分配的所有内存只是不必要的迂腐,让你花时间做一些操作系统会更有效地为你做的事情。
编辑(技术细节):
对于 malloc 的某些实现,在程序结束时进行不必要的内存释放可能会非常低效。所有保持其会计信息内联(通过边界标记或类似机制)的 malloc 实现将触及您已分配的大部分(如果不是全部)页面。通常,除了弄脏缓存行和被丢弃的 TLB 条目之外,这不是问题,但是将此与使用足够内存来开始使用交换的程序相结合,最终您会交换大量内存以释放它。当您退出时,操作系统可以更有效地执行此操作(只需将交换槽标记为空闲)。
如果您有一个将内存返回给操作系统的 malloc 实现,则释放内存将导致操作系统取消映射内存,如果您在多处理器系统上,这又需要昂贵的 TLB 操作。在退出时,可以更有效地完成无效(通过执行完整的 TLB 刷新或使 TLB 标记无效)。
您的问题不完整……因此,您可以获得的最佳答案是“视情况而定”。
从程序范围来看,是的,您有内存泄漏。这应该是显而易见的。从系统范围来看,答案取决于您运行的操作系统。
一般来说,如果您在主流设备(Win7/MacOSX/Linux 台式机/笔记本电脑、iOS/Android 设备等)上编程,您会非常安全。我想不出任何主流的现代操作系统都无法在您之后进行清理。
但是,如果您在一些较旧的或嵌入式系统上工作,您将在此处泄漏内存。我在 uCLinux 平台(专为没有 MMU [内存管理单元] 的硬件设计的操作系统)上看到了内存泄漏。
动态内存通常被认为是危险的,这就是为什么在某些 RTOS 上使用它是不合法的。如果您知道应用程序在整个使用生命周期中的部署范围,那么您可以编写这样的代码……但您很可能不知道,您不应该对操作系统会做什么做出假设. 总是清理自己的烂摊子。