提问人:FaceBro 提问时间:11/24/2019 最后编辑:FaceBro 更新时间:11/25/2019 访问量:635
如何在 Python 中释放 C 函数中错位的内存
How to release memory that is malloced in C function in Python
问:
我在 Python 中调用了一个名为 decrypt 的 C 函数,decrypt 返回一个错位的内存缓冲区。
代码如下:
sl = ctypes.cdll.LoadLibrary('some_crypto.so')
sl.decrypt.argtypes = [ctypes.c_char_p]
sl.decrypt.restype = ctypes.c_char_p
ret = sl.decrypt(ctypes.c_char_p(ciphertext))
在这个阶段,底层 C 函数解密 malloced 一个缓冲区,并作为 ret.
我需要释放 ret 变量的内存以避免内存泄漏吗?
如果是,如何释放底层内存缓冲区?
根据评论添加了更多详细信息。 这种情况不同于如何释放与 Cython 模块接口的外部 C 库分配的内存,其中内存最终返回到 Python 进程?,因为这里没有使用 Cython。
正如这里建议的那样,使用外部 C DLL 时 Python 中的内存泄漏,我使用 convert_and_free_char_p 作为 C 函数解密的重新类型,但仍然发现通过 htop 泄漏内存。
def convert_and_free_char_p(char_p):
if char_p == 0:
return None
try:
return ctypes.c_char_p(char_p).value
finally:
libc.free(char_p)
sl = ctypes.cdll.LoadLibrary('some_crypto.so')
sl.decrypt.argtypes = [ctypes.c_char_p]
sl.decrypt.restype = ctypes.convert_and_free_char_p
for i in range(0, 10000000000000):
ret = sl.decrypt(ctypes.c_char_p(ciphertext))
htop 中此脚本的 VIRT/RES 列一直不显示,表示内存泄漏。
为什么免费无法正常工作?
答: 暂无答案
评论