2015-01-14 42 views
2

流动C代码中的内存泄漏是什么?下面的C代码是内存泄漏吗?

#include <stdlib.h> 
int *a; 

int main() { 
     a = malloc(sizeof(int)*10); 
     return 0; 
} 
+2

不,它很好。 – StackedCrooked

+5

是的,你的代码泄漏了十个整数大小的块。但是,由于它立刻退出,内存将返回到操作系统,因此除valgrind之外,没有人会注意到。 – dasblinkenlight

+0

为了获得泄漏,您需要将它放入一个长循环中调用的函数中。 –

回答

7

至少大部分人使用术语的方式,答案是肯定的 - 由程序分配的任何内存,并永远不会被释放被认为是泄漏。

与此同时,大多数人主要关心的是渐进式泄漏 - 当程序运行时会泄露更多内存,例如在循环内进行分配,并且无法释放记忆。

特别是对于某些确实需要一些内存来保留程序的整个生命周期的内存,在退出之前释放内存和分配内存直到退出完成之间的区别变得更多地是一个真正的分裂问题而不是真正的问题有用的区别。有些人认为它留下分配的内存是一种讽刺,即使它只是在退出前立即释放。其他人则认为这是浪费代码(以及引诱错误)在退出之前立即清除内存(当任何设计良好的操作系统将重新获得流程资源时)。

+0

我在写一个静态分析器来检测内存泄漏。我想知道在这种情况下是否要报告警告。 –

+0

@Zope彭黎:我会说是的,至少可以报告 - 但如果需要的话,可能允许用户禁用报告,特别是如果每​​次运行都会导致一小块不断的块被泄漏。作为一项规则,在不同运行之间出现的泄漏可能更有趣。 –

+0

感谢您的建设性意见。在我们的工具中,目前每次运行的结果都是相同的。 (没有选择随机路径) –

2

因为程序只要它然后分配的Linux(或窗口)退出会自动free内存空间,所以没有泄漏,但你做的东西malloc后,程序结束前,这时会出现泄漏

+2

由'malloc'分配的内存不是显式的'free'd,不保证被操作系统回收 - C标准不需要这种行为。不过,我不会因为你提到linux和windows而低估它。 –

2

这将由valgrind和Intel Inspector作为内存泄漏进行报告,因为分配的内存未被释放。但是,这可能不会对该计划产生影响。

如果这个分配的内存是需要的,直到程序退出,那么这个泄漏警告可以避免。但设计必须明确说明不释放不会导致其他问题,如内存不足。例如,可能有一个控制器对象的单例实例,只要程序运行就必须存在。

但是,如果这样的分配丢失,从来没有使用和设计不考虑他们,那肯定是泄漏。

现在,在你的情况下,这个分配的内存使用没有地方。因此,这种分配必须被视为泄漏。

当程序退出时,操作系统可能会取走所有的内存。当应用程序需要运行很长时间时(例如服务器应用程序),这不会被视为理所当然的,并且会存在很长时间,并且将来会有很多维护。

+1

在我发布这个问题之前,我有点困惑。现在,我想我很清楚这个话题。谢谢! –

1

是的,程序中有内存泄漏。您正在分配一个大小为10 * 4的内存[考虑int需要4个字节],并且您没有释放内存。为避免内存泄漏,您必须释放分配的内存。

#include <stdlib.h> 
    int *a; 

    int main() 
    { 
     /* allocating the Memory */ 
     a = malloc(sizeof (int) *10); 
     /* free the allocate memory */ 
     free (a); 
     return 0; 
    }