如何用python ctypes管理字符串内存

1 投票
2 回答
2711 浏览
提问于 2025-04-16 18:54

我写的Python代码调用了一个我自己写的C语言库里的函数。这个函数需要两个字符串作为输入,最后会返回一个字符串作为结果。Python传给C库的这两个字符串只是被C库读取,所以我不担心它们的内存管理。根据我的理解,这些字符串的内存是由Python来分配的,等到Python觉得合适的时候会自动释放。

不过,我知道C库返回的字符串的内存需要我自己来管理。有一种方法是:C函数会分配一个字符数组,把结果填进去,然后返回这个数组。Python代码使用这个返回的字符串后,需要调用libc的free函数来释放这个字符串的内存,或者调用C库里的另一个函数来处理内存释放。

还有其他方法吗?ctype有没有提供一些工具函数,可以简化释放本地库返回的数据结构的内存?

2 个回答

3

一种常见的方法是给C语言的函数添加一个额外的缓冲区参数和一个长度参数。如果调用这个函数时,提供的缓冲区大小小于所需的大小,函数就会返回所需的缓冲区大小,而不执行其他操作。否则,数据会被复制到缓冲区中,并且大小会被设置为实际复制的数据大小。

这样,你就可以在Python中管理这个缓冲区,不过这样做会让你的C函数多出两个参数。

4

我强烈建议不要在通过 ctypes 调用的外部函数中分配内存,然后再从 Python 中释放这块内存。尽量在 Python 中进行内存分配。

在你的情况下,如果你事先知道返回字符串的最大长度,可以使用

buf = ctypes.create_string_buffer(upper_limt)

在 Python 中分配内存,并将这块内存的指针传递给你的函数。

撰写回答