如何创建一个Python不会释放的缓冲区?
我需要在Python中调用一个C语言库里的函数,这个函数会释放传入的参数。于是我尝试使用create_string_buffer(),但好像这个缓冲区会被Python在之后释放,这样就会导致这个缓冲区被释放两次。
我在网上看到,Python会对缓冲区进行引用计数,当没有引用的时候就会释放它。那么我该如何创建一个缓冲区,让Python在之后不再管它呢?谢谢。
举个例子:我用以下代码加载动态链接库:lib = cdll.LoadLibrary("libxxx.so")
,然后用这行代码调用函数:path = create_string_buffer(topdir)
,接着调用lib.load(path)
。但是,libxxx.so中的load函数会释放它的参数。而之后“path”又会被Python释放,这样就会出现被释放两次的情况。
1 个回答
3
请按照以下顺序尝试:
尽量在Python中管理好你的内存,比如使用
create_string_buffer()
。如果你能控制C函数的行为,可以修改它,让它不要free()
这个缓冲区。如果你调用的库函数在使用后会释放这个缓冲区,那一定有某个库函数负责分配这个缓冲区(或者这个库有问题)。
当然,你可以通过
ctypes
调用malloc()
,但这样会破坏内存管理的好习惯。最好把它当作最后的手段来使用。几乎可以肯定,这样做会在之后引入难以发现的bug。