我对 Python 及其 C API 很陌生。我仍然不明白引用计数是如何工作的。我编写了一个粒子跟踪模块,它向 python 公开了我过去编写和测试过的许多 C++ 线程跟踪函数。(据我所知,他们自己没有内存泄漏)。
当我在 Python 中反复调用其中一个函数时,我可以看到内存使用量增长缓慢。我相信某处存在内存泄漏(可能无处不在: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:发现这个参考有用