在TCL 8.6.9上,我尝试使用TCL_MEM_DEBUG来帮助诊断应用程序中的内存泄漏,但是在使用/启用它时发生崩溃。
相同的代码在没有TCL的情况下编译时运行良好,但是在使用该标志时崩溃。
[调用函数“ Tcl_ResetResult-> ResetObjResult-> Tcl_IsShared(在调试中为Tcl_DbIsShared)”时,TCL中的代码崩溃。
在执行“ Tcl_Eval()”时发生。
(这是具有多个线程(解释器)的应用程序。
谢谢
更多一点信息:这在DLL中创建的线程中发生。因此,当从TCL加载DLL时,我们在这里做什么,我们创建了一个新的TCL解释器(Tcl_CreateInterp),然后在其中使用该解释器的地方创建了一个新线程。其他线程(带有自己的解释器)将命令发送到执行它们的那个线程。这是发生此崩溃的时间。
因此,我猜想在线程Th1中创建了一些obj并将其提供给线程Th2,但是线程Th2仍然没有创建任何对象。通常,它永远不会发生,因为在线程自身中创建了解释器(并且在初始化阶段将创建多个对象)。刚才您确实在上面写过:
我们创建一个新的TCL解释器(Tcl_CreateInterp),然后在使用该解释器的地方创建一个新线程。
尽管我根本不认为这是个好主意(线程存储等方面的过度工作,但我认为这可能是我们这方面的意外行为,如果可以的话,我们应该予以解决。
只要它仍然不固定,解决方法只是在与您的应用程序中的tcl对象一起工作的每个线程中
创建1个空对象
,如下所示:#ifdef TCL_MEM_DEBUG
if (1) { Tcl_Obj *objPtr = Tcl_NewObj(); Tcl_DecrRefCount(objPtr); };
#endif