2012-03-01 4 views
1

Я строю вложенный набор кортежей в расширение Cython 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; 

Теперь, если я вместо того, чтобы заменить PyTuple_SetItem(outer, index, inner) с Py_CLEAR(inner), использование памяти не растет с течением времени.

Я неправильно отношусь к внешнему кортежу, крадущему ссылку на внутренний кортеж? Есть ли другая причина, по которой память не будет исправлена?

+0

Код не должен протекать. Я бы добавил утверждения, чтобы проверить возвращаемое значение каждой функции API и показать код, скрывающийся за «...». – sterin

ответ

1

Оказывается, я ошибался в очень медленно растущем использовании памяти (по другим причинам) для утечки памяти. Если бы подсчет ссылок не удался, это значительно увеличилось бы. Итак, это правда. Этот код не течет.

+0

В случае, если это немного запутанно ... код возвращал набор окон, обнаруженных на изображении. Оказывается, что в списке изображений, которые я использовал, просто появилось больше окон на каждом изображении, поэтому с течением времени больше памяти. – squidpickles