1

저는 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을 발견
+1

'(아마도 사방 : O)'lol –

답변

1

this 관련인가?

사용 t = PyTuple_New(n) 대신하고 PyTuple_SetItem(t, i, o)을 사용하여 객체로 채우기 -이 o의 참조 카운트를 "먹는"있습니다, 그래서 당신은 그것을 Py_INCREF()에 있습니다.

이 구절이 명확한 지 확실하지 않지만 좋은 출발점 일 수 있습니다.

+0

하지만 이미 PyTuple_New를 사용하고 있습니다. 미안하지만, 당신의 제안을 이해하지 못했습니다 ... – Ximenes

+0

나는 제안하지 않았습니다. 나는 파이썬 FAQ를 인용했다. –