我编写了一个 Cython 函数,该函数将数字的列表/类型化内存视图作为参数并返回相同长度的类型化内存视图:
def test(list_data):
cdef unsigned int n = len(list_data)
cdef unsigned int i = 0
cdef double *results_arr = <double*>malloc(n* sizeof(double) )
cdef double[:] results = <double[:n]>results_arr
for i in range(n):
results[i] = 220 - list_data[i]
return results
在对其进行了数千次测试后,我开始收到Segmentation fault (core dumped)
错误消息。我意识到这是一个内存管理问题,但我找不到如何管理函数返回的类型化内存视图的内存的示例。我发现的唯一有用信息是关于内存分配的信息,它建议将生命周期与result_arr
python 对象联系起来,并使用一种__dealloc__
方法来释放内存。
有没有一种方法来管理 memoryview 垃圾收集,它不涉及创建用于释放内存的 python 类?
编辑:我试过这个,它似乎以正确的方式释放内存。
def test(list_data):
cdef unsigned int n = len(list_data)
cdef unsigned int i = 0
cdef double *arr = <double*>malloc(n* sizeof(double) )
if not arr:
raise MemoryError()
cdef double[:] results = <double[:n]>arr
for i in range(n):
results[i] = 220 - list_data[i]
free(arr)
return results
为什么这行得通,是否有更好的方法来管理内存?