我有以下情况:
SWIG包装的类A
(包含一个std :: thread,它在销毁时连接,并且运行自己的Tcl解释器)
Tcl解释器提示%
% A a
% a -delete
% exit
以上工作正常。 GDB报告由对象A a
拥有的a
生成的线程已停止。
% A a
% exit
上面的结果导致底层C ++类的析构函数没有被调用,线程继续运行,并且在程序退出时破坏了(在仍在运行的线程中,它对于它的存在突然丧失是毫无准备的)。这很好,花花公子,因为它是程序退出,但它并没有让我对为什么没有被调用的析构函数不再那么古怪。
我是否可以使用SWIG中的某种设置告诉它自己清理?
(故意没有用C ++标记,因为这个问题真的不是关于C ++的......)
答案 0 :(得分:1)
Tcl在响应exit
时不会删除内存结构,因为这通常是浪费时间。最终确定成本很高,操作系统通常比应用程序要好得多。
但也有例外。你有其中一个。你需要做的是安装一个带有Tcl_CreateExitHandler
的退出处理程序,尽管对象仍然存在,但它会关闭线程。我不知道如何将其与SWIG集成。
另一种方法是将您的代码放在子解释器中(请参阅interp
命令)并使exit
退出该子解释器。然后整齐地删除命令 (并且一旦看到孩子完成,主翻译就可以干净利落地去掉。)