我正在学习在 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;
}
我对引用计数的理解不完整,如有任何帮助,我们将不胜感激。
最佳答案
在这种情况下,Py_DECREF 将简单地释放使用 tp->alloc 分配的内存。
tp->alloc 将引用计数设置为 1。Py_DECREF 将引用计数从 1 减少到 0;当它发现引用计数为 0 时,它会调用适当的函数来释放内存(在本例中为 Noddy_dealloc。)
如果 python C api 函数返回 NULL,则说明出了问题;通常会设置一个异常(保存在全局变量中)。
如果调用者再次返回 NULL,则异常被链接,因此“返回 NULL”。
关于python - Py_DECREF 和 PY_INCREF 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24444667/