unique_ptr析构函数优势

时间:2016-06-04 19:08:03

标签: c++ c++11 unique-ptr

使用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)

1 个答案:

答案 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()可以采取多种形式:returnifbreakcontinuegoto,{{1} }。当您使用智能指针时,C ++编译器会处理所有这些。