C++ 中是否有作用域管理的文件流?

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

背景

在引入 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 超出范围时,它将负责所有清理工作。它不仅方便,而且实际上有助于防止在早期 returns 或抛出异常的情况下发生内存泄漏。

问题

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

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

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

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

ofstream 本身是范围绑定的,具有可以打开文件的构造函数和关闭文件的析构函数。所以你可以写

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

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