【问题标题】:Freeing memory allocated via ctypes in Python在 Python 中释放通过 ctypes 分配的内存
【发布时间】:2016-07-20 11:50:16
【问题描述】:

我有一个基于 ctypes 的库,它封装了一个有时会分配需要释放的内存的 C 库。在 Linux 下,这很容易,因为常用的 glibc 功能已链接到该 C 库中,我可以简单地在其上调用 free()。但是,当我在 Windows 下访问该第三方编译的库时,似乎无法使用相同的功能。

ctypes.util.find_msvcrt() 看起来很有希望,但它返回 None 即使我在 Windows 下运行。我不确定这是否意味着源 DLL 是用 Microsoft 工具链以外的东西构建的。

所以,我只剩下要释放的内存,而且没有明显、简单的方法可以做到这一点。有人有什么想法吗?

【问题讨论】:

  • 联系第三方,告诉他们修复损坏的 API。

标签: python c windows ctypes glibc


【解决方案1】:

在使用 MSVCRT 时,您需要确保您使用的是来自同一 CRT 的 相同 free/ malloc 对(您的程序可以与多个 CRT 一起运行)。您正在处理的库似乎已损坏 - 该库应该有一个 free 包装器,它调用正确版本的 free

换句话说,即使您确实找到了某种 MSVCRT free,也不能保证它就是您想要的。

另见http://siomsystems.com/mixing-visual-studio-versions/

【讨论】:

  • 库还可以允许用户定义它使用的分配器。例如,看看custom memory allocators 在 CPython 中是如何实现的。然后通过 ctypes 你可以让库使用 CPython 的raw memory interface
  • 也就是说,我更喜欢具有两遍模型的 API,它返回分配大小,供用户分配所需的内存块。如果这不可能,则可能意味着库需要导出 free 函数——例如释放由某些设备接口专门分配的缓冲区。
猜你喜欢
  • 2011-11-15
  • 2012-01-31
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多