2017-09-22 2 views
1

J'ai converti une fonction python en une fonction cython. Maintenant, la fonction fonctionne comme prévu. Mais je reçois beaucoup de fuite de mémoire lorsque le programme principal appelle cette fonction plusieurs fois. J'ai libéré la mémoire que j'ai allouée dynamiquement, mais cela ne semble pas fonctionner.Fuite de mémoire de fonction Cython

Qu'est-ce que je fais mal ici?

from cpython.mem cimport PyMem_Malloc, PyMem_Free 

def longest_common_substring(refWord, stemWord): 
cdef: 
    int longest, x_longest 
    int x, y, k 
    Py_ssize_t lengthRefWord 
    Py_ssize_t lengthStemWord 
    wchar_t *referenceWord = PyUnicode_AsWideCharString(refWord, &lengthRefWord) 
    wchar_t *stemmableWord = PyUnicode_AsWideCharString(stemWord, &lengthStemWord) 
    int t1 = lengthRefWord+1 
    int t2 = lengthStemWord+1 
    int **m = <int **> PyMem_Malloc(t1 * sizeof(int *)) 
    wchar_t tempChar1; 
    wchar_t tempChar2; 
longest = 0 
x_longest = 0 

for k in range(t1): 
    m[k] = <int *> PyMem_Malloc(t2 * sizeof(int)) 
for x in range(0, t1): 
    for y in range(0, t2): 
     m[x][y] = 0 

for x in range(1, t1): 
    for y in range(1, t2): 
     tempChar1 = referenceWord[x - 1] 
     tempChar2 = stemmableWord[y - 1] 

     if tempChar1 == tempChar2: 
      m[x][y] = m[x - 1][y - 1] + 1 
      if m[x][y] > longest: 
       longest = m[x][y] 
       x_longest = x 
     else: 
      m[x][y] = 0 
for k in range(t1): 
    PyMem_Free(m[k]) 
PyMem_Free(m) 
return refWord[x_longest - longest: x_longest] 

Répondre

2

PyUnicode_AsWideCharString alloue de la mémoire que vous devez libérer. The documentation dit

Renvoie une mémoire tampon allouée par PyMem_Alloc() (utilisation PyMem_Free() pour le libérer) sur le succès.

Vous obtenez deux chaînes de cette fonction, mais vous ne les libérez pas.

+0

Merci beaucoup. J'avais oublié ça. –