【问题标题】:fclose() then free()?fclose() 然后是 free()?
【发布时间】:2015-01-13 06:58:01
【问题描述】:

假设我有以下程序:

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

【问题讨论】:

  • "为什么没有人 free() 文件指针?" - 因为这是完全错误的。
  • free() 也没有收到指向其参数的指针。
  • 首先,您不想在文件描述符表上调用 free(其中 FILE * 指向该表中的某个条目)其次,您只在一个指针上调用 free()由 malloc() 系列函数之一设置(某些函数,如 dup() 在后台使用 malloc,因此需要释放结果指针)
  • 当您将 pFile 传递给 fclose 时,您将传递一个 FILE*。所以 fclose 当然可以免费调用它,它的效果就像你自己做的一样。然而,实际发生的事情要复杂得多。

标签: c file memory free fclose


【解决方案1】:

free 被调用以响应malloc 以返回分配的内存。 fopen 可能确实做了一些 mallocing,但关闭句柄 (fclose) 的行为,按照设计,将清理 fopen 所做的一切。您与fopen 的约定是关闭句柄将释放所有未完成的资源。

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

长话短说,fclose 将清理fopen 创建的所有资源。

【讨论】:

  • 太棒了!谢谢,我从来没有在任何地方找到一个决定性的答案!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    因此,它可能会以一种聪明的方式处理它。

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

    【讨论】:

      【解决方案4】:

      fclose() 将释放相关资源。 但是,当您执行完命令 fclose(fp); , fp 仍然不是 NULL。 因此,您需要明确地将 NULL 分配给它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多