Очистка ресурсов

Во время выполнения обработчика завершения вы можете не знать, какие ресурсы были приобретены до вызова обработчика завершения. Возможно, блок __try инструкций был прерван до получения всех ресурсов, чтобы не все ресурсы были открыты.

Чтобы быть безопасным, необходимо проверка, чтобы узнать, какие ресурсы открыты, прежде чем продолжить очистку обработки завершения. Ниже описана рекомендованная процедура.

  1. Инициализируйте дескрипторы со значением null.

  2. В блоке инструкций __try получите ресурсы. Дескрипторам присваиваются положительные значения по мере получения ресурса.

  3. В блоке инструкций __finally опустите каждый ресурс, соответствующий дескриптор или переменная флага ненулевой или не NULL.

Пример

Например, следующий код использует обработчик завершения для закрытия трех файлов и выпуска блока памяти. Эти ресурсы были приобретены в блоке инструкций __try . Перед очисткой ресурса код сначала проверка, чтобы узнать, был ли получен ресурс.

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

См. также

Написание обработчика завершения
Structured Exception Handling (C/C++)