【发布时间】:2022-01-07 07:32:36
【问题描述】:
我正在使用 python 字节对象将一些数据传递给使用 CFFI 库的本机实现的方法,例如:
from cffi import FFI
ffi = FFI()
lib = ffi.dlopen(libname)
ffi.cdef("""
void foo(char*);
""")
x = b'abc123'
lib.foo(x)
据我了解,本机方法接收的指针是 x 字节对象后面的实际底层缓冲区的指针。这在 99% 的情况下都可以正常工作,但有时指针似乎变得无效,并且它指向的数据包含垃圾,在本机调用完成后的一段时间 - 本机代码在从初始调用返回后保留指针并期望要存在的数据,python 代码确保保留对 x 的引用,以便指针保持有效。
在这些情况下,如果我再次调用具有相同字节对象的本机方法,我可以看到我得到一个指向相同值但位于不同地址的不同指针,这表明字节对象后面的底层缓冲区已经移动(如果我关于 CFFI 提取指向字节对象包含的底层数组的指针的假设是正确的,并且没有在任何地方创建临时副本),即使据我所知,字节对象还没有被修改无论如何(代码是大型代码库的一部分,但我有理由确定字节对象不会被代码直接修改)。
这里会发生什么?我对 CFFI 获取指向字节对象的实际内部缓冲区的指针的假设是否不正确?出于垃圾收集/内存压缩的原因,python是否可能允许以静默方式重新分配字节对象后面的缓冲区,这是否不知道我持有指向它的指针?我正在使用 pypy 而不是默认的 python 解释器,如果这会有所不同的话。
【问题讨论】:
标签: python byte buffer pypy cffi