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