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'.
CPython垃圾收集器使用“引用计数”,即它维护对对象的引用列表。如果对象的引用计数降至零,则意味着垃圾回收器为该对象释放空间是安全的。
因此,当我们定义PyObjects这是我们必须显式调用Py_INCREF和Py_DECREF,分别为对象的,其增加和减少引用计数。
| 归档时间: |
|
| 查看次数: |
5500 次 |
| 最近记录: |