我有一些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代码中编译和运行时,我的C函数(cStuff
)总是按预期运行,其返回值完全由输入决定(不涉及随机数生成)。它使用malloc()
在堆中分配浮点数组,而从不使用free()
s,因为C和Python代码都会在cStuff
完成后终止执行。然而,当我从Python中调用函数时,有时(比如五分之一)会发生内存损坏,cStuff
返回无意义的结果,就好像C程序分配的内存被覆盖了一样。调用C函数时,数组a不会损坏,因为cStuff
在任何情况下都会打印正确的值。知道是什么原因造成的吗?感谢
我无法从代码中推断出问题所在。我需要更多的上下文。
你有没有试过在Valgrind手下经营这个?
http://valgrind.org/info/tools.html#memcheck
这样运行:
> valgrind python script.py