Python 2.7 文档的两个部分提到为扩展模块中定义的容器对象添加循环垃圾收集(CGC) 支持。
Python/C API参考手册给出了两条规则,即,
- 必须使用
PyObject_GC_New()
或分配对象的内存PyObject_GC_NewVar()
。- 一旦所有可能包含对其他容器的引用的字段都被初始化,它必须调用
PyObject_GC_Track()
.
而在Extending and Embedding the Python Interpreter中,Noddy
例如,添加Py_TPFLAGS_HAVE_GC
标志和填充tp_traverse
和tp_clear
插槽似乎足以启用 CGC 支持。上面的两条规则根本没有被实践过。
当我修改Noddy
示例以实际遵循PyObject_GC_New()
/PyObject_GC_Del()
和PyObject_Track()
/的规则时PyObject_GC_UnTrack()
,它出人意料地提出了断言错误说,
Modules/gcmodule.c:348: visit_decref: 断言“gc->gc.gc_refs != 0”失败。引用计数太小
这导致我对实施 CGC 的正确/安全方式感到困惑。任何人都可以提供建议,或者最好是一个具有 CGC 支持的容器对象的简洁示例吗?