私は C++ でアプリケーションを作成しており、これには Tcl インタープリターを使用しています。
Tcl_Interp *_tclInterp = Tcl_CreateInterp();
そして、このインタープリターを関数で初期化しました。インタープリターを初期化した同じ関数内で最後に削除/設定解除したい。だから私がするとき
Get("tcl");
私は同じ通訳者を取得しません。
私の質問は、tcl インタープリターを削除/設定解除する方法です。
Tcl インタープリターでC++ 演算子を使用しないでください。delete
Tcl の実装は C で行われているため (この質問には関係のないさまざまな理由から)、操作するときは C のイディオムを使用する必要があります。特に、Tcl_CreateInterp
とペアになっていTcl_DeleteInterp
ます。それらは同じマニュアルページにも記載されています。(Tcl は、その関数を使用してインタープリターを削除したときに、スタック上でインタープリターが使用されなくなるまで待機するため、すぐにメモリを解放することを保証しませんが、適切な時点でインタープリターを削除する場合は、内部的には、最終的にはインタープリター構造をTcl_DeleteInterp
呼び出すことになりますが、インタープリターはfree()
malloc()
.) RAII スタイルのメモリ管理が必要な場合は、小さなクラスでラップする必要があります (scoped_ptr
別のデストラクタが必要になることを除けば、Boost はほぼ完璧です)。
C++ から注意すべきもう 1 つの点は、Tcl インタープリターが厳密にスレッドにバインドされていることです。Tcl ライブラリは、グローバル ロックの数を最小限に抑えるために、内部でスレッド ローカル データを広範囲に使用します (特に、Tcl には、Python の C 実装の奇妙なグローバル ロックの問題はありません)。インタープリターは、それを作成した同じスレッドからのみアクセスまたは削除できます。
実際に正しく指摘されているように、呼び出す正しい関数は ですが、Tcl_DeleteInterp
それ以上のものがあります ( man 3tcl Tcl_DeleteInterp
):
Tcl_DeleteInterp は、インタプリタを削除済みとしてマークします。インタプリタは、Tcl_Preserve のすべての呼び出しが Tcl_Release の呼び出しと一致したときに、最終的に削除されます。
Tcl_Preserve
したがって、インタープリター ( / Tcl_Release
) で参照カウントを行っていない場合は、インターTcl_DeleteInterp
プリターを削除します。