使用unique_ptr析构函数而不是直接在C ++ 11中关闭文件有什么好处?
即。这段代码
FILE* p = fopen("filename","r");
unique_ptr<FILE, int(*)(FILE*)> h(p, fclose);
if (fclose(h.release()) == 0)
p = nullptr;
VS
FILE* p = fopen("filename","r");
fclose(p)
答案 0 :(得分:4)
不需要第一个代码块的最后两行。此外,你没有对该文件做任何事情。这就是优势变得明显的地方。
使用unique_ptr,您可以在打开文件时安排一次fclose()
来电,再也不用担心了。
使用C样式,fopen()
和fclose()
之间有很多代码,并且必须确保这些代码都不能跳过fclose()
。
这是一个更现实的比较:
typedef std::unique_ptr<FILE, int(*)(FILE*)> smart_file;
smart_file h(fopen("filename", "r"), &fclose);
read_file_header(h.get());
if (header.invalid) return false;
return process_file(h.get());
VS
FILE* p = fopen("filename","r");
try {
read_file_header(p);
}
catch (...) {
fclose(p);
throw;
}
if (header.invalid) {
fclose(p);
return false;
}
try {
auto result = process_file(p);
fclose(p);
return result;
}
catch (...) {
fclose(p);
throw;
}
跳过fclose()
可以采取多种形式:return
,if
,break
,continue
,goto
,{{1} }。当您使用智能指针时,C ++编译器会处理所有这些。