我正在学习用python定义“新类型”的教程,https://docs.python.org/2/extending/newtypes.html, 我不明白在这段代码中使用Py_DECREF的目的。
static PyObject *
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
Noddy *self;
self = (Noddy *)type->tp_alloc(type, 0);
if (self != NULL) {
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
self->last = PyString_FromString("");
if (self->last == NULL)
{
Py_DECREF(self);
return NULL;
}
self->number = 0;
}
return (PyObject *)self;
}
我对参考计数的理解不全面,如有任何帮助将不胜感激。
CPython垃圾收集器使用“引用计数”,即它维护对对象的引用列表。如果对象的引用计数降至零,则表示垃圾收集器释放该对象的空间是安全的。
因此,当我们定义PyObjects时,必须显式调用Py_INCREF和Py_DECREF,它们分别增加和减少对象的引用计数。
在这种情况下,Py_DECREF只需释放使用tp->;alloc分配的内存。
tp->;alloc将ref count设置为1。Py_DECREF将ref计数从1减少到0;当它发现ref计数为0时,它调用适当的函数来释放内存(在本例中是Noddy_dealloc)
如果PythonC api函数返回空值,则出现问题;通常会设置异常(保存在全局变量中)。
如果调用方再次返回NULL,则会链接异常,因此返回NULL。
相关问题 更多 >
编程相关推荐