2014-11-16 215 views
4

假设我有以下程序:fclose()然后free()?

#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

“为什么没有人'free()'文件指针?” - 因为这显然是错误的。 –

+0

'free()'不会收到一个指向它的参数的指针。 –

+0

首先,您不希望在文件描述符表(FILE *点指向该表中的某个条目)上自由调用,您只需对由malloc之一设置的指针调用free() )函数族(某些函数,如dup()在后台使用malloc,所以生成的指针需要被释放) – user3629249

回答

10

free被调用以响应malloc返回分配的内存。 fopen可能确实会做一些处理,但是关闭句柄(fclose)的行为在设计上会清理所有fopen所做的一切。您与fopen签订的合同是关闭句柄将释放所有未完成的资源。

一般的经验法则是每alloc有一个free。如果你调用了一个函数,那么它的描述应该警告你调用者负责释放的东西。

长话短说,fclose将清理由fopen创建的任何资源。

+0

太棒了!谢谢,我从来没有找到任何地方的决定性答案! –

2

fopen函数的内存分配取决于实现(每个CRT)。您可以确定fclose总是实现以释放分配给fopen的所有内存。