我的c ++程序使用了很多文件指针并且有很多返回语句
为了避免在没有关闭所有打开文件指针的情况下到达return语句,我写了这个类,基于我保证在到达return语句时自动调用所有对象的析构函数的假设。
我的假设是真的吗?
这是好的代码吗?
File_pointer.cpp中的构造函数和析构函数
File_pointer::File_pointer(string filename)
{
fptr.open(filename.c_str());
};
File_pointer::~File_pointer()
{
fptr.close();
};
实施实例
int main ()
{
File_pointer myfile("myfile.txt");
int x = 2;
switch(x)
{
case 1: return x;
case 2: return x;
default:
break;
};
return 0;
}
答案 0 :(得分:3)
这是真的吗?
是;具有automatic storage duration的所有对象在超出范围时都会调用它们的析构函数。
为了澄清,自动对象是一个未动态分配的非静态本地对象。
这是好的代码吗?
这是主观的。但我要说的是,依赖于作用域来自动调用析构函数是一种非常常见的C ++习惯用法,其名称为resource acquisition is initialisation (RAII)。
像std::ofstream
这样的类已经使用RAII了;他们的析构函数会自动关闭文件。因此,如果您的fptr
是std::ofstream
,那么您的包装类完全是多余的。
答案 1 :(得分:0)
如果可以wrap resources,请使用提升智能指针。总是比你自己做的任何事情都更好地测试。但是很简单。
答案 2 :(得分:0)
我认为fptr
是FILE
类中的File_pointer
指针
虽然你的方法接近RAII范式,但我应该指出你没有适当地处理错误。
e.g。如果fopen
失败怎么办?