支持循环垃圾收集

Python 对检测和收集涉及循环引用的垃圾的支持需要来自对象类型的支持,这些对象类型是其他对象(也可能是容器)的“容器”。不存储对其他对象的引用或仅存储对原子类型(例如数字或字符串)的引用的类型不需要为垃圾回收提供任何显式支持。

若要创建容器类型,类型对象的tp_flags字段必须包含Py_TPFLAGS_HAVE_GC并提供tp_traverse处理程序的实现。如果类型的实例是可变的,则还必须提供tp_clear实现。

容器类型的构造函数必须符合两个规则:

同样,对象的解除分配器也必须遵循Pair相似的规则:

在 3.8 版中进行了更改:_PyObject_GC_TRACK()_PyObject_GC_UNTRACK()宏已从公共 C API 中删除。

tp_traverse处理程序接受以下类型的函数参数:

tp_traverse处理程序必须具有以下类型:

为了简化编写tp_traverse处理程序的过程,提供了一个Py_VISIT()宏。为了使用此宏,tp_traverse实现必须将其参数精确命名为* visit arg *:

static int
my_traverse(Noddy *self, visitproc visit, void *arg)
{
    Py_VISIT(self->foo);
    Py_VISIT(self->bar);
    return 0;
}

tp_clear处理函数必须为inquiry类型,如果对象是不可变的,则必须为NULL

首页