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 优点。
背景
在引入 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 优点。