1
int main()
{
    char *a = malloc(1024);
    return 0;
}

上面的程序有内存泄漏吗?请提供尽可能完整和技术性的答案。

4

4 回答 4

4

简单的答案是肯定的。操作系统正在为您整理

编辑

为了 gg.kaspersky 的利益。

当程序结束时,您应该已经整理了堆。它表示您已经考虑了所有分配并提供了这些资源的释放(对于打开的文件或其他操作系统资源可以说是正确的)。

这对你来说够复杂吗?

顺便说一句 - 访问家庭 (OS) 时保持与到达时相同的状态是一种礼貌。

于 2013-03-13T12:30:55.100 回答
4

程序本身有泄漏。操作系统是否清除它是另一回事。我想最好问'这个程序可能会导致任何系统出现问题吗?答案是肯定的。

C标准没有说分配的内存malloc将在程序终止时释放,无论是正常还是异常。将其与打开的文件进行比较,如果程序正常终止,C 实现会保证为您关闭这些文件。

于 2013-03-13T13:25:08.973 回答
1

我不会认为这是内存泄漏。退出时仍可通过仍在作用域内的变量访问内存。

在程序结束时释放你分配的所有内存只是不必要的迂腐,让你花时间做一些操作系统会更有效地为你做的事情。

编辑(技术细节):

对于 malloc 的某些实现,在程序结束时进行不必要的内存释放可能会非常低效。所有保持其会计信息内联(通过边界标记或类似机制)的 malloc 实现将触及您已分配的大部分(如果不是全部)页面。通常,除了弄脏缓存行和被丢弃的 TLB 条目之外,这不是问题,但是将此与使用足够内存来开始使用交换的程序相结合,最终您会交换大量内存以释放它。当您退出时,操作系统可以更有效地执行此操作(只需将交换槽标记为空闲)。

如果您有一个将内存返回给操作系统的 malloc 实现,则释放内存将导致操作系统取消映射内存,如果您在多处理器系统上,这又需要昂贵的 TLB 操作。在退出时,可以更有效地完成无效(通过执行完整的 TLB 刷新或使 TLB 标记无效)。

于 2013-03-13T12:35:28.137 回答
1

您的问题不完整……因此,您可以获得的最佳答案是“视情况而定”。

从程序范围来看,是的,您有内存泄漏。这应该是显而易见的。从系统范围来看,答案取决于您运行的操作系统。

一般来说,如果您在主流设备(Win7/MacOSX/Linux 台式机/笔记本电脑、iOS/Android 设备等)上编程,您会非常安全。我想不出任何主流的现代操作系统都无法在您之后进行清理。

但是,如果您在一些较旧的或嵌入式系统上工作,您在此处泄漏内存。我在 uCLinux 平台(专为没有 MMU [内存管理单元] 的硬件设计的操作系统)上看到了内存泄漏。

动态内存通常被认为是危险的,这就是为什么在某些 RTOS 上使用它是不合法的。如果您知道应用程序在整个使用生命周期中的部署范围,那么您可以编写这样的代码……但您很可能不知道,您不应该对操作系统会做什么做出假设. 总是清理自己的烂摊子。

于 2013-03-13T12:45:39.203 回答