4 回答
TA贡献1998条经验 获得超6个赞
没有
这就是RAII的目的,让析构函数完成其工作。手动关闭它没有什么害处,但这不是C ++方式,而是使用类在C中进行编程。
如果要在函数结束之前关闭文件,则可以始终使用嵌套作用域。
在标准(27.8.1.5类模板basic_ifstream)中,ifstream将使用basic_filebuf拥有实际文件句柄的成员来实现。它作为成员保存,以便当ifstream对象销毁时,它还会在上调用销毁器basic_filebuf。根据标准(27.8.1.2),该析构函数将关闭文件:
virtual ˜basic_filebuf();
效果:销毁class对象basic_filebuf<charT,traits>。来电close()。
TA贡献1803条经验 获得超3个赞
您需要关闭文件吗?
没有
您应该关闭文件吗?
要看。
您是否担心文件无法正确关闭时可能发生的错误情况?请记住,setstate(failbit)如果失败,则关闭呼叫。析构函数会调用close()自动为您因为RAII但不会离开你作为测试对象已不存在失败位的方法。
TA贡献1921条经验 获得超9个赞
您可以允许析构函数完成其工作。但是,就像任何RAII对象一样,有时手动调用close可能会有所作为。例如:
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
return 0;
}
写入文件内容。但:
#include <stdlib.h>
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
exit(0);
}
没有。在极少数情况下,进程突然退出。崩溃过程可能会执行类似的操作。
TA贡献1775条经验 获得超8个赞
不,这是由ifstream
析构函数自动完成的。您应该手动调用它的唯一原因是因为fstream
实例的作用域很大,例如,如果它是寿命很长的类实例的成员变量。
- 4 回答
- 0 关注
- 3252 浏览
相关问题推荐
添加回答
举报