在Python包装器中调用外部C库时出现奇怪的内存损坏
我有一些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代码中编译和运行时总是表现正常,它的返回值完全由输入决定(没有涉及随机数生成)。这个函数会使用malloc()
在堆上分配浮点数组,并且从不调用free()
,因为C和Python代码在cStuff
完成后就会结束执行。然而,当我从Python中调用这个函数时,有时(大约五次中有一次)会发生内存损坏,cStuff
返回的结果毫无意义,就好像C程序分配的内存被覆盖了一样。数组a在调用C函数时并没有损坏,因为无论如何cStuff
都会打印出正确的值。你觉得这可能是什么原因呢?谢谢
1 个回答
3
我从你的代码中看不出问题出在哪里。我需要更多的信息。
你试过在 Valgrind 下运行这个吗?
http://valgrind.org/info/tools.html#memcheck
可以这样运行:
> valgrind python script.py