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

Is it a memory leak in the following C code?

是否是流动的C代码中的内存泄漏?

 #include <stdlib.h>
 int *a;

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

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

与此同时,大多数人主要关注 渐进式 泄漏 - can/will 随着程序运行逐渐泄漏更多内存,例如从执行循环内的分配,并且无法释放该内存。

特别是对于确实需要一些内存在程序的整个生命周期内保持分配的东西,在退出前释放内存和在退出完成之前保留分配的内存之间的区别更像是一个吹毛求疵的问题,而不是一个简单的问题。真正有用的区别。有些人认为保留分配的内存是一种讽刺,即使它只是在退出前立即释放。其他人认为在退出前显式释放内存是浪费代码(并且会引起错误)(当任何设计得当的 OS 无论如何都会重新获得进程的资源时)。

由于程序在分配后立即退出,因此 linux(或 windows)将自动 free 内存 space 所以没有泄漏,但你是在 malloc 之后和程序结束之前做一些事情,然后会有泄漏

这将被 valgrind 和 Intel Inspector 报告为内存泄漏,因为分配的内存未被释放。但是,这可能不会对程序产生影响。

如果在程序退出之前都需要分配的内存,则可以避免此泄漏警告。但是设计必须指定不释放不会导致内存不足等其他问题。例如,可能有一些控制器对象的单例实例,只要程序 运行s.

就必须存在。

但是,如果这样的分配丢失并且从未使用过,并且设计没有考虑到它们,那么这绝对是一个泄漏。

现在,在您的情况下,分配的内存没有用到任何地方。因此,此类分配必须被视为泄漏。

程序退出时,OS可能会带走所有内存。当应用程序必须 运行 很长一段时间(如服务器应用程序)并且将存在很长时间并且将来会有很多维护时,不能认为这是理所当然的。

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