6

C ++で実装されている(ただしC APIを備えている)ライブラリにリンクするCプログラムでsetjmpとlongjmpを使用したいと思います。

C ++コードは動的メモリ割り当てを行い、ポインタはAPIを介して渡されますが、コードのC側がそれらの(不透明な)オブジェクトを正しく管理している限り、longjmpを使用するときに混乱することはありませんよね?

これらの関数をC++コードで使用するのは安全ではないことは知っていますが、C ++コードにリンクされているCコードでは安全である必要がありますか?

4

3 に答える 3

4

CコードからC++関数を呼び出すという事実は、setjmpとlongjmpをいつもより安全でなくすることにはなりません。

重要なのは、ライブラリがリソースを割り当てる場合、longjmpが呼び出された後にそれらが適切に解放されるように、リカバリコードを配置する必要があるということです。これは自分の割り当てでは簡単なことですが、使用するCインターフェイスの構造によっては、C++ライブラリでは難しい場合や不可能な場合があります。

于 2011-08-31T04:21:09.460 に答える
2

setjmp/longjmpは、一般に、C++での使用には安全ではありません。例外の動作を効果的に複製しますが、スタックを正しく巻き戻すことはありません(たとえば、強制的に終了するスタックフレーム上のオブジェクトに対してデストラクタを実行しません)。可能であれば、例外がある場合は、代わりに例外を使用してください。

于 2011-08-31T05:46:44.783 に答える
1

まあ、正しいと正しくない。longjmp通常、デストラクタは呼び出されないため、次のようなコードで使用します。

void f(jmp_buf jb)
{
  some_cpp_object_with_a_nontrivial_destructor x;
  if (some_condition) longjmp(jb, 2);
  // some other code
}

あらゆる種類の悪いことが起こります。そのような状況を避ければ、大丈夫です。(一般に、longjmpは、重要なデストラクタを持つオブジェクトを含むアクティブなスタックフレームを飛び越えてはなりません。)

于 2011-08-31T06:25:11.137 に答える