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() 会消失。不会的!
相反,每个对象都保存在其包含范围的字典中,依此类推回到模块字典。当这个模块字典被破坏时,破坏将通过所有分支向外蔓延。
我在 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() 会消失。不会的!
相反,每个对象都保存在其包含范围的字典中,依此类推回到模块字典。当这个模块字典被破坏时,破坏将通过所有分支向外蔓延。