Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
以下に関して、linux/gcc の C++ で longjmp と setjmp を使用しても安全ですか?
*this
setjmp()/longjmp()スタックの巻き戻しを完全に覆すため、例外処理と RAII (一般的なデストラクタ) を無効にします。
setjmp()
longjmp()
標準の18.7/4「その他のランタイムサポート」から:
プログラム内の別の (宛先) ポイントに制御を転送するスローされた例外によって自動オブジェクトが破棄される場合、同じ (宛先) ポイントに制御を転送するスロー ポイントでの呼び出しlongjmp(jbuf, val)の動作は未定義です。
longjmp(jbuf, val)
つまり、setjmp()/longjmp()は C++ ではうまく機能しないということです。
Linux や gcc に固有のものではありません。setjmp / longjmp と C++ は、longjmp を使用してデストラクタを持つ自動変数があるコンテキストを離れている場合、うまく連携できません。
デストラクタが実行されないため、メモリ リークやその他の不適切な動作が発生する可能性があります。