如何删除tcl解释器?

时间:2012-05-28 04:36:16

标签: c++ tcl

我在c ++中有一个应用程序,我正在使用tcl解释器。我已经使用

为我的应用程序创建了一个tcl解释器
Tcl_Interp *_tclInterp = Tcl_CreateInterp();

我在一个函数中初始化了这个解释器。我想在我初始化它的同一个函数里面删除/取消设置解释器。所以,当我做一个

Get("tcl"); 
打电话我不会得到同样的翻译。

所以我的问题是如何删除/取消设置tcl解释器。

2 个答案:

答案 0 :(得分:6)

您必须在Tcl解释器上使用C ++ delete运算符。 Tcl的实现是在C中(由于各种原因与这个问题无关)所以你必须在与它交互时使用C语言。特别是,Tcl_CreateInterpTcl_DeleteInterp配对;他们甚至记录在same manual page上。 (当你用该函数删除解释器时,Tcl不保证立即释放内存,因为它等待它不再在堆栈中使用它,但是如果你在一个理智的点上删除它,那么你将会好吧。在内部,Tcl_DeleteInterp最终会在解释器结构上调用free(),这是正确的,因为解释器是通过malloc()分配的。)如果你想要RAII风格的内存管理,那么你我必须将它包装在一个小类中(Boost scoped_ptr几乎是完美的,除了你需要一个不同的析构函数)。

从C ++中要注意的另一件事是Tcl解释器严格线程绑定; Tcl库在内部广泛使用线程本地数据,以将全局锁的数量减少到最低限度(特别是,Tcl没有Python的C实现的任何奇怪的全局锁定问题)。只能从创建它的同一个线程中访问或删除解释器。

答案 1 :(得分:0)

正如actual正确地指出的那样,正确的调用函数是Tcl_DeleteInterp,但它还有更多(man 3tcl Tcl_DeleteInterp):

Tcl_DeleteInterp将解释器标记为已删除;当对Tcl_Preserve的所有调用都通过调用Tcl_Release来匹配时,解释器最终将被删除。

因此,如果您没有对口译员进行任何引用计数(Tcl_Preserve / Tcl_Release),那么Tcl_DeleteInterp将删除您的口译员。