Rustのnightlyで "C-unwind" が利用できるようになった。
C++の関数AからRustの関数Bを呼び、BからC++の関数Cを呼ぶ。Cが例外を投げてAでキャッチしたときに、Bはどうなるか。
BはCが例外を投げることを知らないので、もしBにデストラクタが存在していた場合そのデストラクタが実行されることは保証されない。
そのため、これまではデストラクタが呼び出されないように気を付けてコードを書く必要があった。
例としてC++と書いたが、他の言語と相互運用する際も同様の問題がある。
今後は例外を投げる関数は "C-unwind" と宣言することで、Bのデストラクタが確実に呼ばれるようになる。
ただし全ての言語でできるという保証はなく、その言語がプラットフォームの提供する仕組みを利用している必要がある(longjmpを含む 動かなかったので確認中)
また、 panic=unwind (デフォルト設定)でビルドする必要がある。
間違いがあったらコメントでご指摘ください。
あと、どの言語はどの機能で例外を実装しているかという表をどこかで見かけた気がするので、見かけたら教えてください。