0

我有以下情况:

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

% A a
% a -delete
% exit

以上工作正常。A aGDB 报告由 object产生的线程a已停止。

% A a
% exit

上述结果导致底层 C++ 类的析构函数没有被调用,线程继续运行,并在程序退出时破坏(在仍在运行的线程中,这对于它的突然消失完全没有准备好)。这很好,很花哨,因为它是程序退出,但它并没有让我对为什么不调用析构函数感到疑惑。

SWIG 中是否有某种设置可以用来告诉它自行清理?

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

4

1 回答 1

1

Tcl 在响应 an 时不会删除内存结构,exit因为这通常完全是浪费时间。最终确定是昂贵的,而且操作系统通常比应用程序更擅长。

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

另一种方法是将您的代码放在子解释器中(请参阅interp命令),然后exit退出该子解释器。然后命令被整齐地删除(主解释器一旦看到子解释器完成就可以干净地离开)。

于 2013-07-20T08:08:11.270 回答