Как правильно освободить объект PyTuple
с помощью Python C-API?
Я знаю, что кортежи являются чем-то особенным, когда дело доходит до семантики подсчета ссылок, поскольку PyTuple_SetItem
" украдет"ссылку на вставленный элемент.Я также знаю, что уменьшение ссылки на объект кортежа уменьшает счетчик ссылок всех элементов в кортеже.
Имея это в виду, я думаю, что можно с уверенностью сказать:
#include <Python.h>
#include <stdio.h>
int main()
{
PyObject* tup = PyTuple_New(1);
PyTuple_SetItem(tup, 0, PyLong_FromLong(100L));
printf("Ref Count: %d\n", tup->ob_refcnt);
Py_DECREF(tup);
}
Но последняя строка вызывает ошибку сегментации, когда я уменьшаю счетчик ссылок на кортежи.Я не понимаю, почему это происходит.Прямо перед вызовом Py_DECREF
счетчик ссылок равен 1
, так в чем же проблема?