我尝试 swig 像这样包装一个 C++ 类:
class Test {
public:
Test() {printf("Construct\n");}
~Test() {printf("Deconstruct\n");}
};
假设 swig 包装的模块是pytest
,我尝试了以下代码:
x = dict(a=pytest.Test())
del x
我看到了预期的输出“Construct”。但是,有时我看不到输出“解构”。我猜这是因为Test
当我解除分配字典时,持有 C++ 对象的对象没有被解除分配x
。所以我尝试了这个:
import gc
gc.collect()
我仍然没有看到“解构”。我在退出 ipython shell 时看到了它。所以我的问题是(1)当它们不再被引用时,我如何明确地让 python 释放 swig 包装的 C++ 对象;(2) 有没有一种方法可以让 python 的行为方式是一旦主机 python 对象被取消引用,swig 包装的对象就会立即被释放?
编辑:
当我执行以下操作时,可能会出现问题:
x = dict(a=pytest.Test())
x
del x
当我试图检查是什么时发出第二个命令x
。然后从Out
ipython 的列表中引用该对象。
所以现在我的问题是:是否保证gc.collect()
将删除所有未引用的变量(即,它们__del__
被调用)?