次の点に関して、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に固有のものではありません。 longjmpを使用して、デストラクタを含む自動変数があるコンテキストを残す場合、setjmp/longjmpとC++はあまりうまく連携しません。
デストラクタは実行されないため、メモリリークやその他の不正な動作が発生する可能性があります。