Windows

         

пытаемся перескочить через блок finally


Снова изменим код функции:

DWORD Funcenstein3()
{
DWORD dwTemp;

// 1 Что-то делаем здесь

__try
{
// 2. Запрашиваем разрешение на доступ
// к защищенным данным, а затем используем их

WaitForSingleObject(g_hSem, INFINITE);

g_dwProtectedData = 5;
dwTemp = g_dwProtectedData;

// пытаемся перескочить через блок finally
goto ReturnValue:
}

__finally
{
// 3. Даем и другим попользоваться защищенными данными

ReleaseSemaphore(g_hSem, 1, NULL);
}

dwTemp = 9;

// 4. Продолжаем что-то делать
ReturnValue:

return(dwTemp);
}

Обнаружив в блоке try функции Funcenstein3 оператор gofo, компилятор генери рует код для локальной раскрутки, чтобы сначала выполнялся блок finаllу . Но на этот раз после finаllу исполняется код, расположенный за меткой RetumValue, так как воз врат из функции не происходит ни в блоке try, ни в блоке finally. B итоге функция возвращает 5. И опять, поскольку Бы прервали естественный ход потока управления из try в finally, быстродействие программы — в зависимости от типа процессора — может снизиться весьма значительно.


Содержание раздела