它看起来像stream.read()
分配由buffer
指向的内存。如果是这样的话,你不能返回到C++空间分配的python空间数据。你应该:
1)创建一个Python对象,或numpy
数组,如果你愿意,在python /用Cython代码
2)由*buffer
指出,分配新的闪亮Python对象所分配的内存中的数据复制在python空间。然后你可以返回这个对象。
这是必要的,因为python无法以任何方式处理在C
空间中分配的内存,并且您的C
代码分配的内存正在泄漏,即它不会被释放。
现在你还问,为什么你不cdef char *buffer = ''
得到错误。在后一种情况下,cython识别出buffer
指向一个字符串,并自动生成一个新的Python对象,其内容指向buffer
。例如遵循ipython
:
%%cython
def ReturnThisString():
cdef char *buffer = 'foobar'
return buffer
print ReturnThisString() #this outputs 'foobar'
注意buffer
由您C
编译器堆栈初始化,而且也没有保证,当你从蟒蛇使用此函数的字符串将仍然存在于内存位置。但是,当cython运行return语句时,它会自动从你的char *
指针初始化一个python字符串。 (在python 3中,我认为它被转换为bytes
@Veedrac说,但这是一个小问题)。在这第二种情况下,Python对象的创建和复制操作是隐藏的并由cython
保留,但它仍然存在。
它看起来像stream.read()分配'buffer'指向的内存。如果是这样的话,你不能返回到C++空间分配的python空间数据。 – gg349
@flebool如何在char上工作? –
见答案,太短留在这里 – gg349