gpt4 book ai didi

python - Python/C API 中的内存泄漏和引用计数

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:45 25 4
gpt4 key购买 nike

我对 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:找到this reference有用的

最佳答案

this相关吗?

Use t = PyTuple_New(n) instead, and fill it with objects using PyTuple_SetItem(t, i, o) – note that this "eats" a reference count of o, so you have to Py_INCREF() it.

我不完全确定这段话是否清楚,但这可能是一个很好的起点。

关于python - Python/C API 中的内存泄漏和引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com