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

标签 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 都会打印正确的值。知道什么可能导致这种情况吗? 谢谢

最佳答案

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

您尝试过在 Valgrind 下运行它吗?

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

像这样运行:

> valgrind python script.py

关于python - 在 Python 包装器中调用外部 C 库时出现奇怪的内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902372/

相关文章:

python - 让 Python 包以不同的名称安装自身

python - 如何在 Python 中导入 caffe 模块?

python - pytest中的参数化测试类

javascript - Visual Studio 将 Javascript 调试与 Windows 10 Edge 集成

java - System.out.println()耗时; Java语句?

python 使用 print 函数重定向 stdout,是否可以扩展到多个输出,时间是什么?

c++ - 将 char* 分成几个变量

c - C 中的另一个 Fork() 程序

对命令提示符、Visual Studio exe 和文本文件感到困惑?

linux - 使 GNU ld 或 GNU gold 显示存档中使用了哪些 .o 文件