【发布时间】:2012-09-04 00:53:14
【问题描述】:
Python 2.7 文档的两个部分提到为扩展模块中定义的容器对象添加循环垃圾回收 (CGC) 支持。
Python/C API Reference Manual 给出了两条规则,即,
- 必须使用
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 的容器对象示例吗?
【问题讨论】:
标签: python c garbage-collection python-c-api python-extensions