2011-06-03 22 views
1

我的python代碼正在調用本地庫中的C函數(也由我編寫)。該函數將兩個字符串作爲參數,並以字符串的形式返回其響應。 python傳遞給C庫的兩個參數字符串只能由C庫讀取,所以我不擔心他們的內存管理。 AFAIK,它們的內存將由python分配,並將在python運行時似乎適當時釋放。如何用python ctypes管理字符串內存

但是,我知道C庫返回的字符串的內存必須顯式管理。我可以實現它的一種方式是:C函數callocs一個字符數組,填充答案並從函數返回。 python代碼使用返回的字符串,並應該調用該字符串的libc的空閒或調用同一個C庫的另一個函數,該函數將負責釋放內存。

有沒有其他方法可以做到這一點? ctype是否提供了簡化釋放本地庫返回的數據結構內存的實用函數?

回答

5

我建議強烈反對通過​​調用的外部函數中的內存分配,並從Python中釋放此內存。只要有可能,就用Python分配內存。

在你的情況,如果你事先知道返回的字符串的長度上限,使用

buf = ctypes.create_string_buffer(upper_limt) 

分配在Python的內存和一個指針傳遞給該內存的功能。

+0

這在理論上可能會導致緩衝區溢出。 – 2011-06-03 16:50:58

+1

@Noctis:這就是爲什麼我說「如果你事先知道返回字符串長度的上限」。 – 2011-06-03 16:57:35

3

執行此操作的常用方法是向C函數添加一個附加緩衝區參數和一個長度參數。如果調用函數的緩衝區大小小於所需大小,則該函數僅返回所需的緩衝區大小並且不執行其他操作,否則,數據將被複制到緩衝區中,並且大小被設置爲實際大小數據被複制。

這允許您在Py​​thon中管理緩衝區,代價是將2個附加參數添加到C函數中。