2

SWIGでラップした大量のC++コードがあり、Javaから呼び出しています。C ++コードは、ブーストスマートポインターを自由に使用します。

一部のJUnitテストは完了しましたが、クリーンアップ中にセグメンテーション違反が発生しました。スタックトレースは、オブジェクトのファイナライズでメモリエラーを示していますが、SWIGによって生成されたJNIコードで発生しており、スマートポインター参照カウントに関連付けられているようです。

コードのすべてのレイヤーをステップスルーできるようにしたいと思います。これは可能ですか?また、この種の問題について他の人の経験を聞いてとてもうれしく思います。

4

1 に答える 1

1

実行中のJavaコードに2番目のネイティブコードデバッガーをアタッチできます。たとえば、Visual Studioでは、[デバッグ]>[プロセスにアタッチ]を使用してアタッチできます。

SWIGはスマートポインターをサポートしていますが、Java側でその存続期間を明示的に管理する必要があります。Java側でスマートポインタオブジェクトの所有権を取得する場合は、それを削除する必要があります。Javaにはスコープ外になる一時的なオブジェクトがないため、各レベルの戻り値がスマートポインターであるf()。g()。h()のような式を使用できないことに注意してください。

フェイルセーフとして、ガベージコレクションが発生した場合、SWIGで生成されたファイナライザーはそれを削除しようとします。オブジェクトがC++側ですでに削除されている場合、そのフェイルセーフは有害になります。

于 2010-12-17T14:59:55.080 に答える