c++ - 为什么 fclose 不将文件指针设置为 NULL?

标签 c++ pointers fclose

我正在为 FILE * 写一个 RAII 包装器。我注意到当 FILE * 在析构函数中关闭后被删除时,它会导致未定义的行为(seg.fault 或其他地方的错误)。我假设 fclose 会将 FILE * 设置为 NULL,但事实并非如此。

class smartFP {
  smartFP (const std::string& name) 
  : fp (fopen(name.c_str(), "r")
  { }

  ~smartFP()
  { 
     if (fp) {
        fclose(fp); 
        // delete(fp); <- This is causing crash
        fp = NULL; <- Is this OK?
     }
  }

private:
   FILE *fp;
};
  • 为什么 fclose 不将 FILE * 设置为 NULL?
  • 第二个问题是fopen是在堆还是栈中为fp分配内存?我认为它在堆上执行,因此想在 fclose 之后执行删除操作,以便 fp 的堆上的 4 或 8 个字节被取消分配。但是看起来不需要这个。

最佳答案

当然 delete fp 会导致崩溃。它不是用 new 分配的。仅对使用 new 获得的内容或文档告诉您使用它的其他内容调用 deletefopen 的文档从未告诉您使用 delete。文件的所有清理都由 fclose 执行;在调用文件相关资源后,您无需执行任何其他操作即可释放它。

设置 fp = NULL 就可以了。这可能是可取的,这样这个“智能文件指针”的 future 消费者可以检查指针是否仍然有效。 (不过,它在 reset 方法中比在析构函数中更有用;在析构函数运行后,指针类不会有任何 future 的消费者,因为该对象不再存在。)但是fclose 不能自己做,因为 fclose 没有通过引用接收它的参数,即使它接收了,它也无法使 all 无效 文件指针的可能拷贝。回想一下,freedelete 也没有将它们的参数设置为 NULL

关于c++ - 为什么 fclose 不将文件指针设置为 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7277030/

相关文章:

c++ - 套接字发送接收函数

c++ - 运行 BFS 以找到从图的底部到顶部的最短路径

c++ - 如何在 C++ 中读取复杂的文本文件?

c++ - 我似乎有消失的指针

c - 为什么文件无法打开/关闭

c - 是否可以从 FILE* 中拯救文件描述符?

c++ - 通过参数推导对模板化类数组进行隐式初始化

c - 如何更改指针以指向不同的对象?

c++ - C函数指针

C - fclose() 触发断点