以下的C代码是否存在内存泄漏问题?

3

下面的 C 代码是否存在内存泄露问题?

 #include <stdlib.h>
 int *a;

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

2
不,这很好。 - StackedCrooked
5
是的,你的代码泄漏了一个大小为十个整数的内存块。但是,由于它立即退出,内存会被返回给操作系统,所以除了valgrind之外,没有人会注意到这一点。 - Sergey Kalinichenko
要获取一个泄漏,你需要将其放在一个被长循环调用的函数中。 - PM 77-1
2
定义 "leak" 的含义。 - David Heffernan
嗨,Vality。这段代码只是用来澄清这个“泄漏”问题的。 - Zhaopeng Li
显示剩余2条评论
4个回答

7

至少大多数人使用这个术语的方式是肯定的——程序分配但从未释放的任何内存都被视为泄漏。

与此同时,大多数人主要关注渐进式泄漏——随着程序运行,可能会泄漏越来越多的内存,例如在循环内进行分配,并未释放该内存。

特别是对于那些确实需要一些内存始终保持分配状态的程序,释放和退出之前保留内存分配之间的区别更多地成为一个吹毛求疵的问题,而不是真正有用的区别。一些人认为即使只在退出之前立即释放内存也是一种耻辱。其他人则认为,在退出之前明确释放内存是一种浪费代码(并且容易出现错误)的做法(当任何设计良好的操作系统都将重新获得进程的资源时)。


我正在编写一个静态分析器来检测内存泄漏。我在思考是否应该在这种情况下报告警告。 - Zhaopeng Li
@ZhaopengLi:我认为是的,至少应该允许报告它——但如果每次运行都会导致一小部分常量块泄漏,可能应该允许用户禁用报告,特别是如果这些泄漏在不同运行之间有所变化,那么它们可能更有趣。 - Jerry Coffin
感谢您的建设性意见。在我们的工具中,目前每次运行都会得出相同的结果。(没有选择随机路径) - Zhaopeng Li

2

是的,您的程序存在内存泄漏问题。您分配了大小为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;
    }

2

由于程序在分配内存后立即退出,因此Linux(或Windows)将自动free该内存空间,因此不会泄漏,但如果您在malloc之后并在程序结束之前执行其他操作,则会导致内存泄漏。


2
malloc分配的内存如果没有显式地被free释放,操作系统不能保证回收该内存 - 这种行为不是C标准所要求的。然而,我不会因为你提到了Linux和Windows而对此进行贬低评价。 - Drew McGowen

2
这将被valgrind和Intel Inspector报告为内存泄漏,因为分配的内存没有被释放。然而,这可能不会对程序产生影响。
如果这个分配的内存需要在程序退出之前一直存在,那么可以避免内存泄漏警告。但是设计必须指定不释放不会导致其他问题,如内存不足。例如,可能有一些控制器对象的单例实例必须在程序运行期间一直存在。
然而,如果这样的分配丢失并且从未使用,而设计也没有考虑它们,那么它肯定是一个泄漏。
现在,在您的情况下,这个分配的内存没有被使用。因此,这样的分配必须被视为泄漏。
可能当程序退出时,操作系统会收回所有内存。当应用程序需要长时间运行(如服务器应用程序)并且将来需要大量维护时,不应将其视为理所当然。

1
在我发出这个问题之前,我有点困惑。现在,我认为我对这个话题很清楚了。谢谢! - Zhaopeng Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接