Где мне поместить Py_INCREF и Py_DECREF в этот блок в Python C Extension?

Каждый раз, когда я вызываю свою функцию, использование памяти увеличивается примерно на + 10 МБ на вызов, поэтому я думаю, что здесь есть утечка памяти.

....
PyObject *pair = PyTuple_New(2), *item = PyList_New(0);

PyTuple_SetItem(pair, 0, PyInt_FromLong(v[j]));

if(v[j] != DISTANCE_MAX && (p[j] || d[0][j])){
  jp=j;
  while(jp!=istart) {
    PyList_Append(item, PyInt_FromLong(jp));
    jp=p[jp];
  }

  PyList_Append(item, PyInt_FromLong(jp));

  PyList_Reverse(item);
}

PyTuple_SetItem(pair, 1, item);

return pair;
....

Когда я читаю документ , некоторые вызовы например

void
bug(PyObject *list)
{
    PyObject *item = PyList_GetItem(list, 0);

    PyList_SetItem(list, 1, PyInt_FromLong(0L));
    PyObject_Print(item, stdout, 0); /* BUG! */
}

, необходимо указать счетчики ссылок, как это

void
no_bug(PyObject *list)
{
    PyObject *item = PyList_GetItem(list, 0);

    Py_INCREF(item);
    PyList_SetItem(list, 1, PyInt_FromLong(0L));
    PyObject_Print(item, stdout, 0);
    Py_DECREF(item);
}

Итак, где мне разместить Py_INCREF и Py_DECREF в моей функции?

7
задан agf 9 August 2011 в 04:47
поделиться