如何创建一个Python不会释放的缓冲区?

2 投票
1 回答
1098 浏览
提问于 2025-04-16 20:23

我需要在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

请按照以下顺序尝试:

  1. 尽量在Python中管理好你的内存,比如使用 create_string_buffer()。如果你能控制C函数的行为,可以修改它,让它不要 free() 这个缓冲区。

  2. 如果你调用的库函数在使用后会释放这个缓冲区,那一定有某个库函数负责分配这个缓冲区(或者这个库有问题)。

  3. 当然,你可以通过 ctypes 调用 malloc(),但这样会破坏内存管理的好习惯。最好把它当作最后的手段来使用。几乎可以肯定,这样做会在之后引入难以发现的bug。

撰写回答