为什么fclose没有将文件指针设置为NULL?

cpp*_*der 0 c++ pointers fclose

我正在为FILE*编写RAII包装器.我注意到,当在析构函数中关闭后删除FILE*会导致未定义的行为(seg.错误或其他地方的错误).我假设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;
};
Run Code Online (Sandbox Code Playgroud)
  • 为什么fclose没有将FILE*设置为NULL?
  • 第二个问题是fopen在堆或堆栈中为fp分配内存吗?我认为它在堆上做了,因此想在fclose之后进行删除,这样fp的堆上的4或8个字节就被解除分配了.但看起来这不是必需的.

Rob*_*edy 14

当然delete fp导致崩溃.它没有被分配new.只调用delete你得到的东西new或文件告诉你使用的东西.fopen永远不会告诉您使用的文档delete.文件的所有清理都是通过fclose; 在调用文件相关资源后,您无需另外执行任何操作.

设置fp = NULL很好.可能需要这样的"智能文件指针"的未来消费者可以检查指针是否仍然有效.(从reset方法而不是析构函数来说,它更有用;在析构函数运行后,指针类的任何未来消费者都不会因为该对象不再存在而fclose无法使用.)但是不能这样做因为fclose没有不通过引用接收它的参数,即使它这样做,它也不能使文件指针的所有可能副本无效.回想一下,freedelete没有设置自己的论点NULL,无论是.