fread示例来自C++;参考文献

fread示例来自C++;参考文献,c,fread,C,Fread,在编写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 = f

在编写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;
}
/*fread示例:读取完整文件*/
#包括
#包括
int main(){
文件*pFile;
长时间lSize;
字符*缓冲区;
结果的大小;
pFile=fopen(“myfile.bin”、“rb”);
如果(pFile==NULL){fputs(“文件错误”,stderr);退出(1);}
//获取文件大小:
fseek(pFile,0,SEEK_END);
lSize=ftell(pFile);
倒带(pFile);
//分配内存以包含整个文件:
缓冲区=(char*)malloc(sizeof(char)*lSize);
如果(buffer==NULL){fputs(“内存错误”,stderr);退出(2);}
//将文件复制到缓冲区:
结果=fread(缓冲区,1,lSize,pFile);
如果(result!=lSize){fputs(“读取错误”,stderr);退出(3);}
/*整个文件现在加载到内存缓冲区中*/
//终止
fclose(pFile);
自由(缓冲);
返回0;
}
在我看来,如果结果lSize,则永远不会调用空闲(缓冲区)。在本例中,这会是内存泄漏吗


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

当某个进程关闭时,操作系统会通过该进程清除任何未释放的内存。至少,现代操作系统会这样做。

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

从技术上讲,是的,这是一个内存泄漏。但是,当某个进程终止时,该进程分配的任何内存都会自动释放,因此在本例中,实际上并不需要调用free(和fclose)


在更复杂的程序中,这可能是一个真正的问题。丢失的空闲会导致内存泄漏,而丢失的fclose会导致资源泄漏。

在本例中,它不会是内存泄漏,因为终止程序(通过调用
exit()
)会释放与其相关的所有内存


但是,如果您将这段代码用作子例程并调用类似
return1的东西,则可能会出现内存泄漏
代替
exit()

有两种可能的路径

(1) 结果!=lSize—在这种情况下,调用出口(0)。这将终止进程,操作系统将清理内存

(2) result==lsize—在本例中,缓冲区被显式释放,但随后会调用return,因此释放的缓冲区通常只是一种好的样式,因为这也会终止进程,操作系统将再次清理内存


所以在这个简单的例子中,没有内存泄漏。但这可能是一个很好的实践,确保您正在释放您在编写的任何应用程序中分配的任何内存。养成这个习惯可以防止你将来遇到很多麻烦。

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