【问题标题】:How can I create a buffer which Python would not free?如何创建 Python 不会释放的缓冲区?
【发布时间】:2011-06-27 18:02:43
【问题描述】:

我需要从 python 调用 C 库中的一个函数,这将释放()参数。 于是我尝试了create_string_buffer(),但是好像这个缓冲区稍后会被Python释放,这会使缓冲区被释放两次。

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

示例: 我使用:lib = cdll.LoadLibrary("libxxx.so") 加载 dll,然后使用:path = create_string_buffer(topdir)lib.load(path) 调用该函数。但是,libxxx.so 中的加载函数会释放它的参数。而后来“路径”会被 Python 释放,所以它被释放了两次

【问题讨论】:

  • 发布您的示例代码以及它有什么问题。问题不清楚。
  • 我加载 dll 时使用:lib = cdll.LoadLibrary("libxxx.so"),然后调用函数时使用:path = create_string_buffer(topdir)lib.load(path)。但是,libxxx.so 中的加载函数会释放它的参数。后来“路径”会被 Python 释放,所以它被释放了两次。
  • 为了让人们可以更轻松地回答您,问题应该包含所有需要的信息 - 编辑问题以添加它,而不是将其放在人们会错过的评论中。

标签: python c buffer ctypes free


【解决方案1】:

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

  1. 尽一切可能在 Python 中管理你的内存,例如使用create_string_buffer()。如果可以控制C函数的行为,修改为不是free()缓冲区。

  2. 如果你调用的库函数在使用后释放了缓冲区,那么肯定有一些库函数分配了缓冲区(或者库坏了)。

  3. 当然,您可以通过ctypes 调用malloc(),但这会破坏内存管理的所有良好做法。将其用作最后的手段。几乎可以肯定,这将在以后引入难以发现的错误。

【讨论】:

  • 谢谢,我尽量不修改库。由于这个库只有三个函数:loadunloadrequest,并且首先调用了load 函数,我认为这是一个设计问题......也许我会尽量保留参考一本字典,因为这似乎比调用malloc()....
猜你喜欢
  • 2015-12-11
  • 2017-09-25
  • 2021-12-14
  • 1970-01-01
  • 2015-03-25
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多