Compartilhar via


Limpeza de recursos

Durante a execução do manipulador de terminação, você pode não saber quais recursos são alocados, na verdade, antes do manipulador de terminação foi chamado.É possível que o __try bloco de declaração foi interrompido antes de todos os recursos foram alocados, para que nem todos os recursos que foram abertos.

Portanto, para sua segurança, você deve verificar para ver quais recursos estão realmente abertos antes de prosseguir com a limpeza de manipulação de terminação.É um procedimento recomendado:

  1. Inicialize alças para NULL.

  2. No __try declaração de bloco, alocar recursos.Alças são definidas para valores positivos, como o recurso está alocado.

  3. No __finally o bloco de declaração, solte a cada recurso cujo identificador correspondente ou uma variável de sinalizador é diferente de zero ou not NULL.

Exemplo

Por exemplo, o código a seguir usa um manipulador de terminação para fechar três arquivos e um bloco de memória que foram alocados na __try bloco de declaração.Antes de limpar um recurso, o código verifica primeiro se o recurso foi alocado.

// 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 também

Referência

Escrever um manipulador de terminação

(C++) de manipulação de exceção estruturada