Limpiar recursos
Durante la ejecución del controlador de terminación, tal vez no sepa qué recursos se han adquirido antes de que se llame al controlador de terminación. Es posible que el bloque de instrucciones __try
se interrumpiera antes de que se adquirieran todos los recursos, de modo que no todos los recursos estuvieran abiertos.
Por tanto, como medida de seguridad, debe comprobar qué recursos están abiertos antes de proceder con la limpieza de controladores de terminación. Un procedimiento recomendado es:
Inicializar los identificadores en NULL.
En el bloque de instrucciones
__try
, adquiera recursos. Los manipuladores se establecen en valores positivos cuando se adquiere el recurso.En el bloque de instrucciones
__finally
, liberar cada recurso cuyo manipulador o variable de marca correspondiente sea distinto de cero o distinto de NULL.
Ejemplo
Por ejemplo, el código siguiente utiliza un controlador de terminación para cerrar tres archivos y liberar un bloque de memoria. Estos recursos se adquirieron en el bloque de instrucciones __try
. Antes de limpiar un recurso, el código comprueba primero si el recurso se adquirió.
// 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();
}
Consulte también
Escritura de un controlador de terminación
Structured Exception Handling (C/C++)
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente las Cuestiones de GitHub como mecanismo de retroalimentación para el contenido y lo sustituiremos por un nuevo sistema de retroalimentación. Para más información, consulta:Enviar y ver comentarios de