2010-08-18 4 views
13

Est-ce que cette fuite ?:Est-ce que PyList_Append (liste, Py_BuildValue (...)) fuit?

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; 
} 

Bien que, je suppose qu'il est préférable de le faire, en tout cas ?:

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; 
} 

Répondre

18

PyList_Append n'augmente en effet le compteur de référence, donc, oui, la première exemple va fuir. PyList_SetItem ne fait pas, ce qui en fait une exception étrange.

La seconde option sera légèrement plus efficace car la liste sera allouée à la bonne taille et Python devra la redimensionner dynamiquement lorsque des éléments sont ajoutés.

+1

Merci de confirmer mes soupçons! – James

+1

Où trouve-t-on la documentation python que PyList_Append incrémente le refcount de l'objet stocké? Je ne vois ça nulle part. –

Questions connexes