我有一些 Cython 代码,它实际上是外部 C 库的包装器,如相关文档和其他几个来源(例如 here 和 here )中所述。我有以下 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
都会打印正确的值。知道什么可能导致这种情况吗?
谢谢
最佳答案
我无法从代码中推断出您的问题所在。我需要更多背景信息。
您尝试过在 Valgrind 下运行它吗?
http://valgrind.org/info/tools.html#memcheck
像这样运行:
> valgrind python script.py
关于python - 在 Python 包装器中调用外部 C 库时出现奇怪的内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902372/