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

2 投票
1 回答
1136 浏览
提问于 2025-04-17 16:02

我有一些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

撰写回答