Спасибо за ответы. Я понимаю, почему исключения C ++ не могут надежно проходить границы COM. Что должен сказать договор COM о структурированных исключениях, проходящих через границу COM?
Как насчет следующего метода, который превращает новые ошибки оператора в структурированные исключения? Или есть веские причины, почему это плохая идея?
void __cdecl OutOfMemoryHandler()
{
RaiseException(STATUS_NO_MEMORY, 0, 0, NULL);
}
std::set_new_handler(OutOfMemoryHandler);
Я заметил, что ATL может сделать аналогичный трюк в AtlThrow при обработке E_OUTOFMEMORY HRESULT, вызвав структурированные исключения STATUS_NO_MEMORY, хотя поведение зависит от определенных символов препроцессора.
В нативном коде этот метод также предполагает, что опция компилятора / EHa должна быть настроена так, чтобы происходило раскручивание стека и вызывались деструкторы для структурированных исключений. Я вижу, что это может привести к снижению производительности, если бы я использовал много предложений try / catch, но в текущем контексте я вообще не использую предложения try / catch. Получу ли я прирост производительности от использования / EHa?
В любом случае хорошей идеей может быть настройка параметров компиляции структуры. Другой плакат о переполнении стека описывает неприятную ошибку, когда критическую секцию, обернутую объектом C ++ (обычно используемую в базовых классах DirectShow), не удалось разблокировать при возникновении структурированного исключения в вызываемом модуле. Настройки компилятора были установлены только для обработки исключений в C ++, и объект, обертывающий критическую секцию, не разрушался, когда возникало структурированное исключение и возникала тупиковая ситуация позже.