1

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)メモリ使用量は時間の経過とともに増加しません。

外側のタプルが内側のタプルへの参照を盗んでいるのは間違っていますか? メモリが再利用されない他の理由はありますか?

4

1 に答える 1

1

非常にゆっくりと増加するメモリ使用量を(他の理由で)メモリリークと間違えていたことがわかりました。参照カウントが失敗していたら、かなり速く成長していたでしょう。だから、それは本当です。このコードは漏れません。

于 2012-03-06T00:35:39.713 に答える