背景
在引入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
早期文件可能无法关闭。
答案 0 :(得分:8)
ofstream
本身是作用域绑定的,可以打开文件的构造函数和关闭它的析构函数。所以你可以写
{
std::ofstream ofs("out.txt");
// writing stuff
}
与您的代码具有相同的行为,加上RAII善良。
答案 1 :(得分:2)
根据http://en.cppreference.com/w/cpp/io/basic_fstream,在调用析构函数时文件将被关闭,因此文件流应该是RAII。