Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Während der Ausführung Beendigungshandler Sie wissen, welche Ressourcen möglicherweise nicht tatsächlich zugeordnet werden, bevor der Beendigungshandler aufgerufen wurde.Es ist möglich, dass der __try-Anweisungsblock unterbrochen wurde, bevor alle Ressourcen zugeordnet wurden, damit nicht alle Ressourcen geöffnet wurden.
Daher um sicherzustellen, sollten Sie überprüfen, um festzustellen, welche Ressourcen tatsächlich geöffnet sind, bevor sie mit Beendigung Behandlung der Bereinigung fortfahren.Eine empfohlene Vorgehensweise ist:
Initialisieren Sie Handles, auf NULL.
Im __try-Anweisungsblock ordnen Sie Ressourcen zu.Ziehpunkte werden auf die positiven Werte festgelegt, während die Ressource zugeordnet ist.
Im __finally-Anweisungsblock geben Sie jede Ressource frei, deren entsprechende Handle- Variable oder Flags ungleich 0 oder nicht NULL ist.
Beispiel
Beispielsweise verwendet der folgende Code einen Beendigungshandler, um drei Dateien zu schließen und ein Speicherblock, die im __try-Anweisungsblock zugeordnet wurden.Bevor zuerst eine Ressource, die Überprüfungen von Code bereinigt wird, um festzustellen, ob die Ressource belegt wurde.
// exceptions_Cleaning_up_Resources.cpp
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
#include <windows.h>
void fileOps() {
FILE *fp1 = NULL,
*fp2 = NULL,
*fp3 = NULL;
LPVOID lpvoid = NULL;
errno_t err;
__try {
lpvoid = malloc( BUFSIZ );
err = fopen_s(&fp1, "ADDRESS.DAT", "w+" );
err = fopen_s(&fp2, "NAMES.DAT", "w+" );
err = fopen_s(&fp3, "CARS.DAT", "w+" );
}
__finally {
if ( fp1 )
fclose( fp1 );
if ( fp2 )
fclose( fp2 );
if ( fp3 )
fclose( fp3 );
if ( lpvoid )
free( lpvoid );
}
}
int main() {
fileOps();
}