Tcl中的SWIG包装对象;析构函数在退出时不被调用

时间:2013-07-20 04:26:13

标签: tcl swig

我有以下情况:

SWIG包装的类A(包含一个std :: thread,它在销毁时连接,并且运行自己的Tcl解释器) Tcl解释器提示%

% A a
% a -delete
% exit

以上工作正常。 GDB报告由对象A a拥有的a生成的线程已停止。

% A a
% exit

上面的结果导致底层C ++类的析构函数没有被调用,线程继续运行,并且在程序退出时破坏了(在仍在运行的线程中,它对于它的存在突然丧失是毫无准备的)。这很好,花花公子,因为它是程序退出,但它并没有让我对为什么没有被调用的析构函数不再那么古怪。

我是否可以使用SWIG中的某种设置告诉它自己清理?

(故意没有用C ++标记,因为这个问题真的不是关于C ++的......)

1 个答案:

答案 0 :(得分:1)

Tcl在响应exit时不会删除内存结构,因为这通常是浪费时间。最终确定成本很高,操作系统通常比应用程序要好得多。

但也有例外。你有其中一个。你需要做的是安装一个带有Tcl_CreateExitHandler的退出处理程序,尽管对象仍然存在,但它会关闭线程。我不知道如何将其与SWIG集成。

另一种方法是将您的代码放在子解释器中(请参阅interp命令)并使exit退出该子解释器。然后整齐地删除命令 (并且一旦看到孩子完成,主翻译就可以干净利落地去掉。)