Очевидная утечка памяти при использовании PyTuple_SetItem

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

Решение

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

Другие вопросы по тегам