私はPythonとそのC APIにかなり慣れていません。参照カウントの仕組みがまだわかりません。私は、過去に作成してテストした多数の C++ スレッド追跡関数を Python に公開する粒子追跡用のモジュールを作成しました。(私が知る限り、メモリリーク自体はありません)。
Python 内からこれらの関数の 1 つを繰り返し呼び出すと、メモリ使用量がゆっくりと増加していることがわかります。どこか (おそらくどこでも :O) にメモリ リークがあると思います。メインの追跡関数の関連するフラグメントの下にコピーして、Py_DECREFs を呼び出す必要があるかどうかを誰かが指摘できるようにしました (たとえば、item_py で?)。
PyObject* _track_particles() {
// more code here ... (no Python/C API calls)
PyObject* result_py = PyTuple_New(particles.size());
for(int i=0; i<particles.size(); ++i) {
PyObject* item_py = PyTuple_New(2);
if (lost_at_turn_idx[i] == PARTICLE_NOT_LOST) {
int offset = i * (nr_turns+1) * 6 + nr_turns * 6;
PyTuple_SetItem(item_py, 0, Py_True);
PyTuple_SetItem(item_py, 1, Py_BuildValue("(dddddd)",
data_out[offset + rx], data_out[offset + px],
data_out[offset + ry], data_out[offset + py],
data_out[offset + de], data_out[offset + dl]));
} else {
PyTuple_SetItem(item_py, 0, Py_False);
PyTuple_SetItem(item_py, 1,
Py_BuildValue("(ii)", lost_at_turn_idx[i],
lost_at_element_idx[i]));
}
PyTuple_SetItem(result_py, i, item_py);
}
return result_py;
}
ps:このリファレンスは役に立ちました