我的python代码在本机库中调用C函数(也是由我编写的)。该函数接受两个字符串作为参数,并将其响应作为字符串返回。 python传递给C库的两个参数字符串只能由C库读取,所以我并不担心它们的内存管理。 AFAIK,它们的内存将由python分配,并在python运行时看起来合适时释放。
但是,据我所知,C库返回的字符串的内存必须明确管理。我可以实现它的一种方法是:C函数callocs一个字符数组,用answer填充它并从函数返回。 python代码使用返回的字符串,应该在该字符串上调用libc的free,或者调用同一个C库的另一个函数来处理释放内存。
还有其他办法吗? ctype是否提供了简化释放本机库返回的数据结构内存的任何实用程序函数?
答案 0 :(得分:5)
我建议强烈反对通过ctypes
调用的外部函数中的内存分配,并从Python中释放这些内存。尽可能在Python中分配内存。
在您的情况下,如果您事先知道返回字符串长度的上限,请使用
buf = ctypes.create_string_buffer(upper_limt)
在Python中分配内存并将指向此内存的指针传递给您的函数。
答案 1 :(得分:3)
执行此操作的常用方法是向C函数添加额外的缓冲区参数和长度参数。如果使用小于所需大小的缓冲区大小调用该函数,则该函数只返回所需的缓冲区大小而不执行其他操作,否则,将数据复制到缓冲区中,并将大小设置为实际大小复制的数据。
这允许您在Python中管理缓冲区,代价是在C函数中添加2个附加参数。