Очистка ресурсов
Во время выполнения прекращени-обработчика, невозможно знать, какие ресурсы виртуального выделены до завершения был вызван обработчик.Возможно, __try блок выписки был прерван до того, как все ресурсы были выбраны, так как не все ресурсы, которые открываются.
Поэтому, чтобы быть безопасно, необходимо проверить, чтобы определить, какие ресурсы перед продолжением фактически открыть с прекращени-регулируя очисткой.Рекомендуемая процедура:
Инициализация маркеры null.
в __try блок выписки выберите ресурсы.Маркеры набор для положительных значений как ресурс выбран.
в __finally блок выписки, освобождает каждый ресурс, соответствующей переменной маркера или пометить безнулева или значение null.
Пример
Например, следующий код использует обработчик завершения, чтобы закрыть 3 файла и блок памяти, выделенных в __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();
}