Я строю вложенный набор кортежей в расширение 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)
, использование памяти не растет с течением времени.
Я неправильно отношусь к внешнему кортежу, крадущему ссылку на внутренний кортеж? Есть ли другая причина, по которой память не будет исправлена?
Код не должен протекать. Я бы добавил утверждения, чтобы проверить возвращаемое значение каждой функции API и показать код, скрывающийся за «...». – sterin