저는 Python과 C API를 처음 접했습니다. 나는 아직도 참조 계산이 어떻게 작동하는지 이해하지 못합니다. 필자는 입자 추적을위한 모듈을 작성하여 파이썬에 과거에 작성하고 테스트 한 많은 C++ 스레드 추적 기능을 제공합니다. (나는 그들이 스스로 메모리 누출이 없다고 말할 수있는 한 멀리).Python/C API에서의 메모리 누수 및 참조 횟수
파이썬에서 이러한 함수 중 하나를 반복적으로 호출하면 메모리 사용량이 서서히 증가하고 있음을 알 수 있습니다. 나는 어딘가에 메모리 누수가 있다고 믿는다. (아마도 모든 곳 : 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;
}
추신 :
유용 this reference을 발견
'(아마도 사방 : O)'lol –