fclose()然后free()?

时间:2014-11-16 06:25:09

标签: c file memory free fclose

假设我有以下程序:

#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()文件指针?

4 个答案:

答案 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。