Sdílet prostřednictvím


Vymazání prostředků

Při provádění obslužné rutiny ukončení nemusíte před voláním ukončení rutiny ukončení vědět, které prostředky jsou ve skutečnosti přiděleny.Je možné, že blok příkazu __try byl přerušena dříve, než byly veškeré prostředky přiděleny, takže ne všechny prostředky byly otevřeny.

Proto byste z důvodu bezpečnosti dříve než přikročíte k zpracování vyčištění při ukončení, měli zkontrolovat, které prostředky jsou skutečně otevřené.Doporučený postup je:

  1. Inicializovat popisovače na hodnotu NULL.

  2. Přidělit zdroje v bloku příkazu __try.Pokud jsou popisovače přiděleny, jsou nastaveny na kladné hodnoty.

  3. V bloku příkazu __finally uvolněte každý prostředek, jehož odpovídající popisovač nebo proměnná příznaku je nenulová nebo není NULL.

Příklad

Například, následující kód používá popisovač ukončení pro uzavření tří souborů a bloku paměti, které byly přiděleny v příkazu __try.Před vyčištěním prostředků kód nejprve zkontroluje, zda tyto prostředky byly přiděleny.

// 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();
}

Viz také

Referenční dokumentace

Zápis obslužné rutiny ukončení

Strukturované zpracování výjimek (C/C++)