Python 释放PyTuple对象

Python 释放PyTuple对象,python,c,python-c-api,python-c-extension,Python,C,Python C Api,Python C Extension,使用Python C-API释放PyTuple对象的正确方法是什么 我知道元组在引用计数语义方面有些特殊,因为PyTuple\u SetItem会“窃取”对插入元素的引用。我还知道,减少元组对象的引用会减少元组中所有元素的引用计数 考虑到这一点,我认为应该有把握地说: #include <Python.h> #include <stdio.h> int main() { PyObject* tup = PyTuple_New(1); PyTuple_Se

使用Python C-API释放
PyTuple
对象的正确方法是什么

我知道元组在引用计数语义方面有些特殊,因为
PyTuple\u 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);
}
#包括
#包括
int main()
{
PyObject*tup=PyTuple_New(1);
PyTuple_集合项(tup,0,PyLong_from long(100L));
printf(“引用计数:%d\n”,tup->ob\u refcnt);
Py_DECREF(tup);
}

但是,当我减少元组引用计数时,最后一行会导致分段错误。我不明白为什么会这样。在调用
Py_DECREF
之前,引用计数是
1
,那么这里有什么问题?

添加调用
Py_Initialize()
在main的开头,然后重试。

Py_DECREF将释放元组,但此时出现的分段错误可能表明您已经损坏了某些早期代码中的内存。查看代码中的其他地方。如果你能发布一个完整的可运行的示例来演示这个问题(我知道可能不容易)。不,这就是整个程序。但是,如果有帮助的话,我在周围的
#include
语句和
main
函数中添加了开头。@Tomek,这不是只有当您要在C程序中嵌入解释器时才需要的吗?您是否尝试过添加
Py_Initialize()?有帮助吗?在使用任何Python API调用之前,需要调用
Py\u Initialize
。否则Python的内部变量将无法正确初始化;包括那些用于内存管理的。你是对的,几乎可以肯定的是,元组或长类型的初始化被遗漏了,因此无法销毁。