我在编写 C 代码时经常使用 www.cplusplus.com 网站作为参考。

我正在阅读页面上引用的示例 恐惧 并有一个问题。

作为一个例子,他们发布了:

/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

在我看来,如果 result != lSize,那么 free(buffer) 永远不会被调用。在这个例子中这会是内存泄漏吗?

我一直认为他们网站上的示例质量非常高。也许我理解不正确?

有帮助吗?

解决方案

这不会是一个内存泄漏的在这个例子中,因为终止程序(通过调用exit())释放与其相关联的所有存储器。

然而,这将是一个内存泄漏如果使用这一段代码作为子程序调用和代替return 1;的类似exit()

其他提示

从技术上讲,是它是内存泄漏。而是由一个进程分配的任何内存时过程终止,所以在本实施例中的呼叫以释放(和FCLOSE)不是真正需要自动释放。

在一个更复杂的程序,这很可能是一个实际问题。缺少的自由将创建一个内存泄漏和丢失FCLOSE会导致资源泄漏。

操作系统通过一个过程清理任何unfreed存储器时进程关闭。至少,现代操作系统做。

如果程序没有在点结果离开= lSize所,也就是说,它与执行的一些其他的路径继续进行,然后是 - !这是一个保证内存泄漏

有两个可能的路径。

(1)导致= lSize所! - 在这种情况下,出口(0)被调用。此杀死过程和操作系统将清理内存。

(2)结果== LSIZE - 在这种情况下,缓冲区显式地释放,但回报被称为右事后所以自由是大多只是良好的作风,因为这也杀死进程,操作系统将再次清洁了存储器中。

因此,在这个简单的例子,不存在内存泄漏。但是,它可能是一个很好的做法,只是要确保你释放你在你写的任何应用程序所分配的内存。进入这个习惯会阻止你许多头痛的未来。

至于可能的内存泄漏,其他人已经回答了这个问题。不久前,我发布了给定代码的变体 应该 正确处理所有可能的错误情况:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top