fread示例来自C++;参考文献
在编写C代码时,我经常使用网站www.cplusplus.com作为参考 我正在阅读页面上引用的示例,有一个问题 例如,他们发布: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
/* 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,因此释放的缓冲区通常只是一种好的样式,因为这也会终止进程,操作系统将再次清理内存
所以在这个简单的例子中,没有内存泄漏。但这可能是一个很好的实践,确保您正在释放您在编写的任何应用程序中分配的任何内存。养成这个习惯可以防止你将来遇到很多麻烦。至于可能的内存泄漏,其他人已经回答了这个问题。不久前,我发布了给定代码的一个变体,它应该正确处理所有可能的错误条件: