我在 C++ 中有一个应用程序,我为此使用 tcl 解释器。我为我的应用程序创建了一个 tcl 解释器,使用
Tcl_Interp *_tclInterp = Tcl_CreateInterp();
我已经在一个函数中初始化了这个解释器。我想最后在我初始化它的同一个函数中删除/取消设置解释器。所以当我做一个
Get("tcl");
打电话给我没有同一个口译员。
所以我的问题是如何删除/取消设置 tcl 解释器。
您不能delete
在 Tcl 解释器上使用 C++运算符。Tcl 的实现是用 C 语言实现的(出于与这个问题无关的各种原因),因此在与它交互时必须使用 C 习惯用法。特别Tcl_CreateInterp
是 与Tcl_DeleteInterp
; 它们甚至记录在同一个手册页上。(当您使用该函数删除解释器时,Tcl 不保证立即释放内存,因为它会一直等到堆栈上不再使用它,但是如果您在理智的时候删除它,那么您将没问题。在内部,Tcl_DeleteInterp
最终调用free()
解释器结构,这是正确的,因为解释器是通过分配的malloc()
.) 如果你想要 RAII 风格的内存管理,你必须将它包装在一个小类中(Boostscoped_ptr
几乎是完美的,除了你需要一个不同的析构函数)。
在 C++ 中要注意的另一件事是 Tcl 解释器是严格线程绑定的。Tcl 库在内部广泛使用线程本地数据,以将全局锁的数量减少到最低限度(特别是,Tcl 没有 Python 的 C 实现的任何奇怪的全局锁问题)。解释器只能从创建它的同一线程中访问或删除。
正如实际正确指出的那样,调用的正确函数是Tcl_DeleteInterp
,但除此之外(man 3tcl Tcl_DeleteInterp
)还有更多:
Tcl_DeleteInterp 将解释器标记为已删除;当对 Tcl_Preserve 的所有调用都与对 Tcl_Release 的调用相匹配时,解释器最终将被删除。
因此,如果您没有对您的解释器 ( Tcl_Preserve
/ Tcl_Release
) 进行任何引用计数,那么Tcl_DeleteInterp
将删除您的解释器。