题
我在编写 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 - 在这种情况下,缓冲区显式地释放,但回报被称为右事后所以自由是大多只是良好的作风,因为这也杀死进程,操作系统将再次清洁了存储器中。
因此,在这个简单的例子,不存在内存泄漏。但是,它可能是一个很好的做法,只是要确保你释放你在你写的任何应用程序所分配的内存。进入这个习惯会阻止你许多头痛的未来。
至于可能的内存泄漏,其他人已经回答了这个问题。不久前,我发布了给定代码的变体 应该 正确处理所有可能的错误情况: