带有文件流的 RAII

RAII with a filestream

本文关键字:RAII 文件      更新时间:2023-10-16

在 c++ 语言中,有多种方法可以打开和操作文件。然而,RAII方法非常流行,因为destruktor负责释放内存。

但是关闭文件流呢?据我所知,destruktor无论如何都应该关闭文件。但是,destruktor也不允许抛出任何异常。因此,如果我不关闭我的流并且它在块结束时被破坏,我可能会丢失有关错误的信息,这可能会在关闭时发生。

我的想法正确吗?尽管采用了 RAII 方法,我应该始终关闭我的流?

例:

{
  std::ofstream ofs;
  ofs.open ("test.txt");
  ofs << "blablabla";
  //do i need the following?
  ofs.close();
}

答案取决于你是否想在关闭时对错误做出反应。

如果要做出反应,则必须手动close并检查错误条件(无法关闭将设置failbit):

std::ofstream str;
// Do something
str.close();
if (str.fail()) {
   // react on error
}

如果你不想反应,何必呢?只需让析构函数关闭文件

你应该让fstream析构函数关闭文件。

正如您所说,析构函数不会引发,因此您永远不会看到关闭文件时发生的任何错误,但 std::basic_fstream::close() 成员函数具有void返回类型,因此也不能发出错误信号。不要担心这个;只需允许析构函数关闭文件,就像任何其他 RAII 类一样。


请注意,fstream基础的缓冲区也具有close()成员函数。此函数返回NULL如果出现错误,或返回成功时的this指针。这个函数是从basic_filebuf的析构函数调用的,而的析构函数又是从basic_fstream的析构函数调用的。您不应该在正常使用下直接调用它。