Механизм исключений Windows явно предназначен для запуска деструкторов и, наконец, очистки типов даже при наличии исключений и аналогичных из других языков.
То, что вы спрашиваете, должно хорошо работать на Windows - это то, для чего оно предназначено.
Однако вам нужно явно включить это в Visual Studio. По умолчанию Visual Studio устанавливает код C ++ с моделью исключений /EHsc
, которая явно предполагает, что extern "C"
функции не генерируют и не пропускают исключения . Это оптимизация, и, как правило, хорошая.
Однако, если вам нужно предположить, что функции extern "C"
генерируют или пропускают исключения, вам нужно изменить модель исключения. Вы, вероятно, хотите /EHs
.
Тем не менее, я бы рекомендовал ознакомиться с последствиями этого, прежде чем изменить его здесь .
Edit: использовать эту функцию или нет, является дискуссионным. Как правило, с исключениями (и другими подобными механизмами) весь код в стеке между метателем и вызывающей стороной должен быть безопасным для исключения. Если вы владеете кодом, то это нормально, если в стеке есть такие вещи, как обратные вызовы Windows или другие библиотеки, вам нужно найти гарантию, что это нормально. И вообще для Windows внутренний код его нет.