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
,那么这里的问题是什么?