0

次のシナリオがあります。

SWIG でラップされたクラスA(破棄時に結合され、独自の Tcl インタープリターを実行している std::thread を含む) Tcl インタープリター プロンプト%

% A a
% a -delete
% exit

上記は問題なく動作します。A aGDB は、オブジェクト が所有する によって生成されたスレッドaが停止したことを報告します。

% A a
% exit

上記の結果、基になる C++ クラスのデストラクタが呼び出されず、スレッドが実行され続け、プログラムの終了時に大混乱が発生します (まだ実行中のスレッドでは、その存在が突然失われる準備ができていません)。これはプログラムの終了であるため、問題なくダンディーですが、デストラクタが呼び出されない理由について疑問が残るわけではありません。

SWIG には、後でクリーンアップするように指示するために使用できる設定がありますか?

(この質問は実際にはC++に関するものではないため、意図的にC++でタグ付けされていません...)

4

1 に答える 1

1

Tcl は、 に応答するときにメモリ構造を削除しませんexit。これは、通常、完全に時間の無駄になるためです。ファイナライズにはコストがかかり、通常、OS はアプリケーションよりもはるかに優れています。

しかし、例外があります。あなたはそれらの1つを持っています。Tcl_CreateExitHandlerオブジェクトがまだ存在しているにもかかわらず、スレッドを閉じる終了ハンドラーをインストールする必要があります 。これを SWIG と統合する方法がわかりません。

もう 1 つの方法は、コードをサブインタープリター (interpコマンドを参照)に入れて、exitそのサブインタープリターを終了させることです。その後、コマンドきれいに削除されます (マスター インタープリターは、子プロセスの終了を確認したら、きれいに削除されます)。

于 2013-07-20T08:08:11.270 に答える