Очевидная утечка памяти при использовании PyTuple_SetItem - PullRequest
1 голос
/ 01 марта 2012

Я строю вложенный набор кортежей в расширении C ++ Python.Однако у меня возникли некоторые проблемы с управлением подсчетом ссылок.

Минимальный код для воссоздания этой утечки памяти:

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), использование памяти не растет со временем.

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

1 Ответ

1 голос
/ 06 марта 2012

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

...