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)
Rob*_*edy 14
当然delete fp导致崩溃.它没有被分配new.只调用delete你得到的东西new或文件告诉你使用的东西.fopen永远不会告诉您使用的文档delete.文件的所有清理都是通过fclose; 在调用文件相关资源后,您无需另外执行任何操作.
设置fp = NULL很好.可能需要这样的"智能文件指针"的未来消费者可以检查指针是否仍然有效.(从reset方法而不是析构函数来说,它更有用;在析构函数运行后,指针类的任何未来消费者都不会因为该对象不再存在而fclose无法使用.)但是不能这样做因为fclose没有不通过引用接收它的参数,即使它这样做,它也不能使文件指针的所有可能副本无效.回想一下,free并delete没有设置自己的论点NULL,无论是.