4

我在 C++ 中有一个应用程序,我为此使用 tcl 解释器。我为我的应用程序创建了一个 tcl 解释器,使用

Tcl_Interp *_tclInterp = Tcl_CreateInterp();

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

Get("tcl"); 

打电话给我没有同一个口译员。

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

4

2 回答 2

6

不能delete在 Tcl 解释器上使用 C++运算符。Tcl 的实现是用 C 语言实现的(出于与这个问题无关的各种原因),因此在与它交互时必须使用 C 习惯用法。特别Tcl_CreateInterp是 与Tcl_DeleteInterp; 它们甚至记录在同一个手册页上。(当您使用该函数删除解释器时,Tcl 不保证立即释放内存,因为它会一直等到堆栈上不再使用它,但是如果您在理智的时候删除它,那么您将没问题。在内部,Tcl_DeleteInterp最终调用free()解释器结构,这是正确的,因为解释器是通过分配的malloc().) 如果你想要 RAII 风格的内存管理,你必须将它包装在一个小类中(Boostscoped_ptr几乎是完美的,除了你需要一个不同的析构函数)。

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

于 2012-05-28T08:47:17.000 回答
0

正如实际正确指出的那样,调用的正确函数是Tcl_DeleteInterp,但除此之外(man 3tcl Tcl_DeleteInterp)还有更多:

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

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

于 2012-05-28T05:19:51.950 回答