我在c ++中有一个应用程序,我正在使用tcl解释器。我已经使用
为我的应用程序创建了一个tcl解释器Tcl_Interp *_tclInterp = Tcl_CreateInterp();
我在一个函数中初始化了这个解释器。我想在我初始化它的同一个函数里面删除/取消设置解释器。所以,当我做一个
Get("tcl");
打电话我不会得到同样的翻译。
所以我的问题是如何删除/取消设置tcl解释器。
答案 0 :(得分:6)
您必须不在Tcl解释器上使用C ++ delete
运算符。
Tcl的实现是在C中(由于各种原因与这个问题无关)所以你必须在与它交互时使用C语言。特别是,Tcl_CreateInterp
与Tcl_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
将删除您的口译员。