我在C ++中嵌入Python。
我有一个可用的C ++ Python扩展对象。
唯一不对的是,如果我将tp_dealloc
设置为自定义函数,它就永远不会被调用。
我原本以为Py_Finalize()会触发这个,或者可能会终止程序。但没有。
有人可以建议为什么tp_dealloc没有被击中?
答案 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()会清除。它不会!
相反,每个对象都保存在字典中,用于包含范围,依此类推回模块字典。当这个模块字典被销毁时,破坏将通过所有分支向外蔓延。