Какова цель PY DECREF и PY INCREF?
Я проходил учебник по определению "новых типов" в 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;
}
мое понимание подсчета ссылок неоднозначно,и любая помощь будет оценена.
2 ответов
в этом случае Py_DECREF просто освободит память, выделенную с помощью TP->alloc.
tp - >alloc устанавливает счетчик ссылок в 1. Py_DECREF уменьшает количество ссылок с 1 до 0; поскольку он находит, что количество ссылок равно 0, он вызывает соответствующие функции для освобождения памяти (Noddy_dealloc в этом случае.)
Если функция API python C возвращает NULL, что-то пошло не так; обычно устанавливается исключение (сохраняется в глобальной переменной).
Если вызывающий объект возвращает NULL снова, исключение приковано, следовательно, "return NULL".
сборщик мусора CPython использует "подсчет ссылок", i.e содержит список ссылок на объект. Если число ссылок объекта падает до нуля, это означает, что сборщик мусора может освободить место для этого объекта.
таким образом, когда мы определяем PyObjects настоятельно необходимо, чтобы мы явно вызывали Py_INCREF и Py_DECREF, которые увеличивают и уменьшают счетчик ссылок объекта соответственно.