web-dev-qa-db-ja.com

C ++:longjmpとsetjmpを使用しても安全ですか?

次の点に関して、linux/gccのC++でlongjmpとsetjmpを使用しても安全ですか?

  1. 例外処理(longjmp/setjmpを使用して例外処理を実装していません。longjmp/ setjmpが標準の例外処理にどのような副作用をもたらすか知りたいです)
  2. *thisポインター
  3. シグナル
  4. スマートポインター(ブーストの共有ポインターと侵入ポインター)
  5. あなたが考えることができる他のもの。
41
jameszhao00

setjmp() / longjmp() スタックの巻き戻し、したがって例外処理とRAII(一般的なデストラクタ)を完全に破壊します。

標準の18.7/4「その他のランタイムサポート」から:

プログラム内の別の(宛先)ポイントに制御を転送するスローされた例外によって自動オブジェクトが破棄される場合、同じ(宛先)ポイントに制御を転送するスローポイントでのlongjmp(jbuf, val)の呼び出しは未定義です。動作。

つまり、setjmp()/longjmp()はC++ではうまく機能しないということです。

58
Michael Burr

Linuxやgccに固有のものではありません。 longjmpを使用して、デストラクタを含む自動変数があるコンテキストを残す場合、setjmp/longjmpとC++はあまりうまく連携しません。

デストラクタは実行されないため、メモリリークやその他の不正な動作が発生する可能性があります。

6
MarkR