2010-08-18 12 views
13

Czy ten wyciek ?:Czy to PyList_Append (lista, Py_BuildValue (...)) wyciek?

static PyObject* foo(PyObject* self, PyObject* args){ 
    PyObect* list = PyList_New(0); 
    for(int i = 0; i < 100; i++) 
     // leak? does PyList_Append increment ref of the temporary? 
     PyList_Append(list, Py_BuildValue("i", 42)); 
    return list; 
} 

Choć przypuszczam, że lepiej, aby to zrobić, w każdym razie ?:

static PyObject* foo(PyObject* self, PyObject* args){ 
    PyObect* list = PyList_New(100); 
    for(int i = 0; i < 100; i++) 
     PyList_SetItem(list, i, Py_BuildValue("i", 42)); 
    return list; 
} 

Odpowiedz

18

PyList_Append rzeczywiście nie zwiększamy licznik odniesienia, tak, tak, pierwszy przykład wycieknie. PyList_SetItem nie robi, co jest dziwnym wyjątkiem.

Druga opcja będzie nieco bardziej wydajna, ponieważ lista zostanie przydzielona do odpowiedniego rozmiaru, a Python musi dynamicznie zmieniać jej rozmiar w miarę dodawania pozycji.

+1

Dzięki za potwierdzenie moich podejrzeń! – James

+1

Skąd pochodzi dokumentacja Pythona, że ​​PyList_Append zwiększa wartość refcount przechowywanego obiektu? Nigdzie tego nie widzę. –