Die beiden letzten Zeilen des ersten Codeblock nicht benötigt werden. Außerdem machst du nichts mit der Datei. Da wird der Vorteil offensichtlich.
Mit unique_ptr, planen Sie die fclose()
Aufruf einmal, wenn Sie die Datei öffnen, und sorgen Sie sich nie wieder darüber.
Mit C-Stil, haben Sie eine Menge Code in zwischen fopen()
und fclose()
und müssen sicherstellen, dass keines dieser Code über die fclose()
springen können.
Hier ist ein realistischer Vergleich:
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;
}
über die fclose()
Springen kann viele Formen annehmen: return
, if
, break
, continue
, goto
, throw
. Der C++ - Compiler handhabt alle von ihnen, wenn Sie einen intelligenten Zeiger verwenden.
Sie brauchen nur: '{std :: unique_ptr h (std :: fopen (" dateiname "," r "), std :: fclose); } '. Das ist es. –
Ja, wird so lange funktionieren, wie ich das unique_ptr nicht kopieren möchte, wenn h eine Mitgliedsvariable wäre. – Damian