Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除tcl解释器? 我在C++中有一个应用程序,我用TCL解释器来做这个。我用< /P>为我的应用程序创建了一个Tcl解释器。 Tcl_Interp *_tclInterp = Tcl_CreateInterp();_C++_Tcl - Fatal编程技术网

如何删除tcl解释器? 我在C++中有一个应用程序,我用TCL解释器来做这个。我用< /P>为我的应用程序创建了一个Tcl解释器。 Tcl_Interp *_tclInterp = Tcl_CreateInterp();

如何删除tcl解释器? 我在C++中有一个应用程序,我用TCL解释器来做这个。我用< /P>为我的应用程序创建了一个Tcl解释器。 Tcl_Interp *_tclInterp = Tcl_CreateInterp();,c++,tcl,C++,Tcl,我在函数中初始化了这个解释器。我想在初始化解释器的同一个函数中删除/取消设置解释器。所以当我做一个 Get("tcl"); 打电话给我,我找不到同样的翻译 因此,我的问题是如何删除/取消设置tcl解释器。正如正确指出的那样,正确调用的函数是tcl\u DeleteInterp,但还有更多内容(): Tcl_DeleteInterp将解释器标记为已删除;当对Tcl_Preserve的所有调用都与对Tcl_Release的调用相匹配时,解释器最终将被删除。 所以如果您没有对您的解释程序进行任何引

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

Get("tcl"); 
打电话给我,我找不到同样的翻译

因此,我的问题是如何删除/取消设置tcl解释器。

正如正确指出的那样,正确调用的函数是
tcl\u DeleteInterp
,但还有更多内容():

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

所以如果您没有对您的解释程序进行任何引用(<代码> TCLIONE TCLSIORION<代码> >,那么<代码> TCLLDELTEEITEP< /COD>将删除您的解释器。

< P>在TCL解释器上,您不能使用C++ <代码>删除> /Cux>运算符。 Tcl的实现是用C实现的(出于各种原因,这些原因与这个问题无关),所以在与它交互时必须使用C语言。特别是,
Tcl_CreateInterp
Tcl_deleteeinterp
配对;它们甚至被记录在地图上。(Tcl不保证在您使用该函数删除解释器时立即释放内存,因为它会等待堆栈上不再使用它,但如果您在正常情况下删除它,那么就可以了。在内部,
Tcl\u DeleteInterp
最终会调用
free()
在解释器结构上,这是正确的,因为解释器是通过
malloc()
分配的。如果您想要RAII风格的内存管理,您必须将其封装在一个小类中(Boost
scoped_ptr
几乎是完美的,只是您需要一个不同的析构函数)


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

有一点是肯定的,那就是您应该调用
delete\u tclinep某个地方。@chris可能不会。库有一个创建它的特殊函数,因此库可能有一个删除它的函数@伊森·斯坦伯格,说得好。我完全忽略了没有使用
new
这一事实。我同意@Ethan的观点,因为我们没有使用new操作符来创建解释器,它是由库内部完成的,因此我希望使用删除方法来删除解释器。您通常不需要依靠解释器自己进行引用;这通常在Tcl的实现中得到了充分的处理。(基本上,当脚本正在积极执行时,引用计数会增加。)