python - Cython函数内存泄漏

标签 python c memory-leaks cython

我已将 python 函数转换为 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]

最佳答案

PyUnicode_AsWideCharString 分配您必须释放的内存。 The documentation

Returns a buffer allocated by PyMem_Alloc() (use PyMem_Free() to free it) on success.

您从此函数中获得两个字符串,但没有释放它们。

关于python - Cython函数内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46357502/

相关文章:

c - 使用给定的指针初始化字符串

c++ - 32位和64位操作系统上的不同计算

c++ - 双向链表的内存泄漏

python - Tensorflow:分类概率分布的 KL 散度

python - 为什么我的功能会自动执行?

c - 多线程中的数组迭代

android - 试图追踪 gref 泄漏

java - 此处理程序类应该是静态的,否则可能会发生泄漏 : final Handler

python - 如何在 Python 中查看和打印 PDF?

python - 一般编程问题。什么时候使用 OOP?