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)
メモリ使用量は時間の経過とともに増加しません。
外側のタプルが内側のタプルへの参照を盗んでいるのは間違っていますか? メモリが再利用されない他の理由はありますか?