Compartir vía


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:

  1. Inicializar los identificadores en NULL.

  2. En el bloque de instrucciones __try, adquiera recursos. Los manipuladores se establecen en valores positivos cuando se adquiere el recurso.

  3. 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++)