Py_DECREF和Py_INCREF的目的是什么?

2024-06-06 16:06:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习用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;
}

我对参考计数的理解不全面,如有任何帮助将不胜感激。


Tags: pyself类型returnif定义typenull
2条回答

CPython垃圾收集器使用“引用计数”,即它维护对对象的引用列表。如果对象的引用计数降至零,则表示垃圾收集器释放该对象的空间是安全的。

因此,当我们定义PyObjects时,必须显式调用Py_INCREFPy_DECREF,它们分别增加和减少对象的引用计数。

在这种情况下,Py_DECREF只需释放使用tp->;alloc分配的内存。

tp->;alloc将ref count设置为1。Py_DECREF将ref计数从1减少到0;当它发现ref计数为0时,它调用适当的函数来释放内存(在本例中是Noddy_dealloc)

如果PythonC api函数返回空值,则出现问题;通常会设置异常(保存在全局变量中)。

如果调用方再次返回NULL,则会链接异常,因此返回NULL。

相关问题 更多 >