假设我有以下程序:
#include <stdio.h>
int main () {
FILE * pFile;
pFile = fopen ("myfile.txt","r");
fclose (pFile);
//This never happens: free(pFile)
return 0;
}
我从未见过关闭文件句柄后执行free(pFile)
的程序。那是为什么?
我知道由于fclose()
没有收到指向pFile
的指针,因此它实际上并没有释放指针的内存。我的印象是,如果指针指向动态分配的内存,指针应始终释放内存。为什么没有人free()
文件指针?
答案 0 :(得分:15)
free
以响应malloc
返回已分配的内存。 fopen
可能确实做了一些mallocing,但是关闭句柄(fclose
)的行为,按照设计,将清理fopen
所做的一切。与fopen
签订的合同是关闭句柄将释放所有未完成的资源。
一般的经验法则是每个alloc
都有一个free
。如果你调用一个alloc
的函数,它的描述应该警告你调用者负责释放的内容。
长话短说,fclose
将清除fopen
创建的所有资源。
答案 1 :(得分:4)
fopen
函数的内存分配取决于实现(每个CRT)。您可以确保始终实现fclose
以释放fopen
分配的所有内存。
答案 2 :(得分:0)
多次关闭文件时,fclose
第一次返回0,但之后返回-1。
因此,它可能会以聪明的方式处理它。
至少在Windows中就是这种情况,如果我错了,请纠正我。
答案 3 :(得分:0)
fclose()将释放相关资源。 但是,当您完成执行命令fclose(fp)时; ,则fp仍不为NULL。 因此,您需要为其明确分配NULL。