fclose()之后再free()?

19
假设我有以下程序:
#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 的指针,所以它实际上并没有释放指针的内存。我一直以为如果指针指向动态分配的内存,那么应该总是释放它们的内存。为什么没有人释放文件指针的内存呢?


为什么没有人释放文件指针?因为那样做是完全错误的。 - The Paramagnetic Croissant
free() 也不接收其参数的指针。 - Keith Thompson
首先,您不希望在文件描述符表上调用free(其中FILE *指向该表中的某个条目)。其次,您只能在由malloc()函数系列之一设置的指针上调用free()(某些函数,如dup(),在后台使用malloc,因此需要释放结果指针)。 - user3629249
当您将pFile传递给fclose时,您正在传递一个FILE*。因此,fclose肯定可以调用free对其进行处理,并且它将具有与您自己执行此操作相同的效果。但是实际发生的情况更加复杂。 - John Leuenhagen
4个回答

32
free用于释放malloc分配的内存。fopen可能确实会进行一些malloc,但关闭句柄(fclose)的操作将按设计清除fopen所做的一切。使用fopen时您的合同是,关闭句柄将释放所有未完成的资源。
一个普遍的经验法则是,对于每个alloc都要有一个free。如果调用执行alloc的函数,则其描述应警告您调用方需要负责释放的内容。
简而言之,fclose将清除由fopen创建的任何资源。

太棒了!谢谢,我从来没有在任何地方找到过一个确定的答案! - Oliver Spryn

5

fopen函数的内存分配是实现相关的(每个CRT)。您可以确信,fclose总是被实现为释放fopen分配的所有内存。


1

fclose()函数会释放相关资源。 然而,在执行fclose(fp);命令后,fp仍然不是NULL。 因此,您需要显式地将其赋值为NULL。


0

当多次关闭文件时,fclose第一次返回0,但之后返回-1。

因此,它可能以智能的方式处理。

至少在Windows中是这样,请纠正我如果我错了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接