Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建Python无法释放的缓冲区?_Python_C_Buffer_Ctypes_Free - Fatal编程技术网

如何创建Python无法释放的缓冲区?

如何创建Python无法释放的缓冲区?,python,c,buffer,ctypes,free,Python,C,Buffer,Ctypes,Free,我需要从python中调用C库中的函数,这将释放()参数。 因此,我尝试创建_string_buffer(),但看起来Python稍后会释放此缓冲区,这将使缓冲区被释放两次 我在网上读到Python会重新计算缓冲区,并在没有引用时释放它们。那么,我怎样才能创建一个python以后不会关心的缓冲区呢?谢谢 例如: 我用:lib=cdll.LoadLibrary(“libxxx.so”)加载dll,然后用:path=create\u string\u buffer(topdir)和lib.load(

我需要从python中调用C库中的函数,这将释放()参数。 因此,我尝试创建_string_buffer(),但看起来Python稍后会释放此缓冲区,这将使缓冲区被释放两次

我在网上读到Python会重新计算缓冲区,并在没有引用时释放它们。那么,我怎样才能创建一个python以后不会关心的缓冲区呢?谢谢

例如:
我用:
lib=cdll.LoadLibrary(“libxxx.so”)
加载dll,然后用:
path=create\u string\u buffer(topdir)
lib.load(path)
调用函数。但是,libxxx.so中的load函数将释放其参数。稍后,Python将释放“path”,因此它将被释放两次

按给定顺序尝试以下操作:

  • 尽量用Python管理内存,例如使用
    create\u string\u buffer()
    。如果可以控制C函数的行为,请将其修改为不释放缓冲区()

  • 如果调用的库函数在使用缓冲区后释放缓冲区,则必须有某个库函数分配缓冲区(或者库已损坏)

  • 当然,您可以通过
    ctypes
    调用
    malloc()
    ,但这会破坏内存管理的所有良好实践。把它当作最后的手段。几乎可以肯定,这将在以后的某个时候引入难以发现的bug


  • 发布您的示例代码以及它的错误。问题还不清楚。我用:
    lib=cdll.LoadLibrary(“libxxx.so”)
    加载dll,然后用:
    path=create\u string\u buffer(topdir)
    lib.load(path)
    调用函数。但是,libxxx.so中的load函数将释放其参数。稍后Python会释放“path”,因此它会被释放两次。为了让人们能够更轻松地回答您,问题应该包含所有需要的信息——编辑问题以添加它,而不是将它放在人们会错过的注释中。谢谢,我正在尝试不修改库。由于此库只有三个函数:
    load
    unload
    request
    ,并且首先调用
    load
    函数,我认为这是一个设计问题。。。也许我会尝试将引用保存在字典中,因为这似乎比调用
    malloc()
    。。。。