46

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

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

2 に答える 2

65

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

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

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

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

于 2009-09-03T21:36:55.010 に答える
6

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

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

于 2009-09-04T21:51:42.420 に答える