在Python包装器中调用外部C库时出现奇怪的内存损坏

时间:2013-02-15 19:57:09

标签: python c debugging cython memory-corruption

我有一些Cython代码,它实际上是外部C库的包装器,如相关文档和其他几个来源(例如herehere)中所述。我有以下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()在堆中分配float数组,而从不free(),因为C和Python代码在cStuff完成后终止执行。但是,当我从Python中调用函数时(有五分之一)会发生内存损坏并且cStuff返回无意义的结果,就好像C程序分配的内存被覆盖一样。调用C函数时,数组a没有损坏,因为在任何情况下都由cStuff打印正确的值。任何可能导致这种情况的想法? 谢谢

1 个答案:

答案 0 :(得分:3)

我无法从代码中推断出您的问题所在。我需要更多的背景。

你试过在Valgrind下运行吗?

http://valgrind.org/info/tools.html#memcheck

像这样运行:

> valgrind python script.py