tp_dealloc在退出时没有被击中

时间:2015-02-01 19:28:50

标签: dealloc python-c-api

我在C ++中嵌入Python。

我有一个可用的C ++ Python扩展对象。

唯一不对的是,如果我将tp_dealloc设置为自定义函数,它就永远不会被调用。

我原本以为Py_Finalize()会触发这个,或者可能会终止程序。但没有。

有人可以建议为什么tp_dealloc没有被击中?

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是引用计数之一。

PyType_Ready()根据您的类型的基础填充各种tp_ *字段。

其中一个是tp_alloc,我将其设置为0。 它的doc说refcount设置为1,内存块为零。

Python创建此类型的每个实例,新的PyObject添加到相应的Python Dictionary中。如果它是模块级变量,则这是模块的字典。

当字典被销毁时,它包含DECREF-s对象。现在refcount将为0,tp_dealloc将运行。

在我的代码中,我似乎在某处执行了额外的INCREF,并且该对象永远不会被垃圾收集。

似乎(除非您使用特定标志进行编译)Python没有允许它跟踪其所有对象的链表。所以我们不能假设Py_Finalize()会清除。它不会!

相反,每个对象都保存在字典中,用于包含范围,依此类推回模块字典。当这个模块字典被销毁时,破坏将通过所有分支向外蔓延。