0

我尝试 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。然后从Outipython 的列表中引用该对象。

所以现在我的问题是:是否保证gc.collect()将删除所有未引用的变量(即,它们__del__被调用)?

4

0 回答 0