2011-02-04 254 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();的呼叫,然後重試。