python - Py_DECREF 和 PY_INCREF 的目的是什么?

标签 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;
}

我对引用计数的理解不完整,如有任何帮助,我们将不胜感激。

最佳答案

在这种情况下,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/

相关文章:

python - 如何向量化 pandas 数据框中的比较?

python - cython setup.py 给出 .o 而不是 .dll

python - 是否可以覆盖 "self"以指向 python 中 self.method 中的另一个对象?

python - 如何获取类方法中定义的所有变量的名称

python - Confluence-Kafka-Python:获取每个主题分区的滞后

python - Heroku 拒绝连接到 postgres 数据库

python - 使用 Python3/C API 更新数组的元素

Python 扩展在处理大型列表时创建无效指针

c++ - 是否可以在运行时修改 PYTHONPATH?

python - PyObject_CallObject 在 bytearray 方法上失败