2012-03-01 53 views
1

我正在C++ Python擴展中構建一組嵌套的元組。但是,我在管理引用計數方面遇到了一些問題。使用PyTuple_SetItem時出現內存泄漏

的最少的代碼來重新創建此內存泄漏:

PyObject *outer = PyTuple_New(outer_size); 
for (size_t index = 0; index < outer_size; ++index) { 
    PyObject *inner = Py_BuildValue("iiiiiiiiid", ...); 
    PyTuple_SetItem(outer, index, inner); 
} 
Py_CLEAR(outer); 
Py_INCREF(Py_None); 
return Py_None; 

現在,如果我不是一個Py_CLEAR(inner)更換PyTuple_SetItem(outer, index, inner),內存使用量不會隨時間而增長。

我錯了有關外元組偷參考內部的元組?有沒有其他原因記憶不會被回收?

+0

代碼應不漏氣。我想補充稱吃着檢查每個API函數的返回值並顯示的代碼背後隱藏了'...'。 – sterin 2012-03-03 04:32:56

回答

1

原來,我錯誤地認爲內存泄漏的緩慢增長的內存使用(出於其他原因)。如果參考計數失敗了,它會大幅增長。所以,這是真的。此代碼不會泄漏。

+0

如果這有點令人困惑......代碼返回在圖像中檢測到的一組窗口。事實證明,我使用的圖像列表恰好在每個圖像中有更多的窗口,因此隨着時間的推移會使用更多的內存。 – squidpickles 2012-03-06 00:37:59