C++ 中是否有范围管理的文件流

Is there a scope-managed file stream in C++?

本文关键字:文件 管理 范围 是否 C++      更新时间:2023-10-16

Background

在引入unique_ptr(或 boost 的作用域指针)之前,到处都有这种样板指针内存管理。

int* a = new int(5);
// do stuff
delete a;
a = nullptr

现在我们可以做

std::unique_ptr<int> a = std::make_unique<int>(5);

就是这样!当a超出范围时,它将负责所有清理工作。这不仅是一种便利,而且实际上有助于防止在早期返回或抛出异常的情况下发生内存泄漏。

问题

写入文件流时,我注意到相同的样板代码

std::ofstream ofs;
ofs.open("out.txt");
// writing stuff
ofs.close();

是否有类似的机制来处理通过 RAII 打开和关闭文件?那么当流(或某种包装器)超出范围时,它会自动脱离范围并释放文件句柄吗?否则,我们可能会遇到与指针相同的问题,如果您早return,文件可能无法关闭。

ofstream本身是作用域限定的,具有可以打开文件的构造函数和关闭文件的析构函数。所以你可以写

{
    std::ofstream ofs("out.txt");
    // writing stuff
}

具有与您的代码相同的行为,以及 RAII 的优点。

根据 http://en.cppreference.com/w/cpp/io/basic_fstream,当析构函数被调用时,文件将被关闭,所以文件流应该已经是RAII。