我有一些 Cython 代码,它实际上是外部 C 库的包装器,如相关文档和其他几个来源(例如此处和此处)中所述。我有以下 Cython 类定义:
import numpy
cimport numpy
cimport clib # my C library
cdef class DoStuff:
def __call__(self, array a):
cdef numpy.ndarray[float, ndim=1] npa = numpy.ascontiguousarray(a)
clib.cStuff( <float*>npa.data )
我的 C 函数 ( cStuff
) 在其他 C 代码中编译和运行时始终按预期运行,其返回值完全由输入确定(不涉及随机数生成)。它使用 s 在堆中分配浮点数组malloc()
,而不是free()
s,因为 C 和 Python 代码cStuff
都在完成后终止执行。但是,当我从 Python 中调用该函数时,有时(例如 5 个中的 1 个)会发生内存损坏并cStuff
返回无意义的结果,就好像 C 程序分配的内存被覆盖了一样。调用 C 函数时数组 a 不会损坏,因为cStuff
在任何情况下都会打印正确的值。知道什么可能导致这种情况吗?谢谢