2017-09-22 1 views
1

파이썬 함수를 cython 함수로 변환했습니다. 이제 함수는 예상대로 작동합니다. 하지만 주 프로그램이이 함수를 여러 번 호출하면 메모리 누수가 많이 발생합니다. 내가 동적으로 할당 한 메모리를 해제했지만 작동하지 않는 것 같습니다.Cython 함수 메모리 누수

내가 뭘 잘못하고 있니?

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] 

답변

2

PyUnicode_AsWideCharString은 해제해야하는 메모리를 할당합니다. The documentation

성공에 (그것을 무료로 사용 PyMem_Free()) PyMem_Alloc()에 의해 할당 된 버퍼를 돌려 말한다.

이 함수에서 두 개의 문자열을 얻지 만 어느 것도 제거 할 수 없습니다.

+0

감사합니다. 나는 그것을 잊어 버렸다. –