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

时间:2015-02-03 13:57:01

标签: c++ file io

背景

在引入unique_ptr(或者提升范围指针)之前,到处都有这种锅炉板指针内存管理。

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早期文件可能无法关闭。

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

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