存储临时 Python 引用 Cython 的不安全 C 导数

Storing unsafe C derivative of temporary Python reference Cython

虽然我已经问了几个类似的问题,但我无法解决如何解决。

基本上我有这个功能:

模块 one.pyx:

cdef char *isInData(data, dataLength):
    cdef char *ret = <char *>malloc(200)
    memset(ret, 0x00, 200)

    if (b"Hello" in data and b"World" in data):
        strcat(ret, b"Hello World!")

return ret

模块 two.pyx:

import one
from libc.stdlib cimport malloc,realloc, free

cdef char *tempo():
    cdef char *str
    str = one.isInData(b"Hello what is up World", 23)

    # do some stuff
    free(str)

问题发生在行 str = one.isInData("Hello what is up World", 23) 上,我假设一旦 isInData->ret 被分配给 strisInData->ret 被删除导致此问题。但是有人帮我解决这个问题吗?

import one

此行执行 Python 导入 one。它不知道 one 中定义的任何 cdef 函数(甚至 one 是一个 Cython 模块...)。因此,它假定 isInData 是一个可以查找的 Python 对象,并且它将是一个可调用对象,返回另一个 Python 对象。

cdf char* str = some_python_function() 是不安全的,因为 str 指向 Python 对象。但是 Python 对象只是一个临时对象,很可能几乎立即被释放。

你的意思是:

cimport one

它告诉 Cython 它是您要导入的 Cython 模块,它应该期望在 compile-time 处找到声明。您可能需要写 a pxd file 来给出声明。


我没有详细查看您的其余代码,所以不知道您是否正确处理了 C 字符串。但总的来说,您可能会发现使用 Python 字符串比乱用 C 字符串处理更容易。