Py_DECREF和PY_INCREF的目的是什么?

Nih*_*ish 14 python python-c-api

我正在阅读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;
}
Run Code Online (Sandbox Code Playgroud)

我对引用计数的理解是不完整的,任何帮助都将受到赞赏.

小智 11

在这种情况下,Py_DECREF将简单地释放用tp-> alloc分配的内存.

tp-> alloc将ref count设置为1. Py_DECREF将ref count从1减少到0; 因为它发现引用计数为0,它调用适当的函数来释放内存(在这种情况下为Noddy_dealloc).

如果python C api函数返回NULL,则出现问题; 通常设置一个异常(保存在全局变量中).

如果调用者再次返回NULL,则链接异常,因此'返回NULL'.


Nih*_*ish 9

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

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