它看起來像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