2011-02-04 255 views
0

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

我知道元组在涉及到引用计数语义时有点特别,因为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,那么这里有什么问题?

+0

Py_DECREF将释放元组,但在此时出现分段错误可能表示您已经损坏了一些较早代码中的内存。查看代码中的其他地方。如果你可以发布一个完整的可运行示例来演示这个问题(我可能不太容易)。 – Duncan 2011-02-04 13:34:11

+0

不,这实际上就是整个程序。但是,如果有帮助,我在周围的``include`语句和`main`函数中添加了。 – Channel72 2011-02-04 13:41:00

回答

2

在main的开始处添加对Py_Initialize();的呼叫,然后重试。