tp_dealloc 退出时没有被击中

tp_dealloc not getting hit upon exit

我在 C++ 中嵌入 Python。

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

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

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

谁能告诉我为什么 tp_dealloc 没有被击中?

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

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

其中之一是 tp_alloc,我已将其设置为 0。 它的文档说 refcount 设置为 1 并且内存块被清零。

每个 Python 创建此类型的实例,都会将一个新的 PyObject 添加到适当的 Python 字典中。如果是模块级变量,则这是模块的字典。

当字典被销毁时,它 DECREF-s 包含的对象。现在引用计数将为 0,tp_dealloc 将得到 运行.

似乎在我的代码中我在某处执行了额外的 INCREF,并且该对象从未被垃圾回收。

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

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