本文记录一个内存测试,个人感觉不一定是对的,anyway,先记录下来这个过程。Python调用C函数,C函数中有malloc申请内存,这块内存应该由谁来释放?
先说我的测试结论:还是要调用配套的C函数来释放,Python的del语句,没有释放C函数申请内存的效果。本文内存测试使用了memory_profiler模块。关于在Python中获取C函数返回的指正,请参考:再谈用ctypes获取C函数返回的指针
测试用C代码如下:
$ cat ccc.c
#include #include typedef struct {
int a;
int b;
float c;
} abc;
abc *init(int a, int b, float c)
{
abc *pt;
pt = (abc *)malloc(sizeof(abc));
pt->a = a;
pt->b = b;
pt->c = c;
return pt;
}
void destroy(abc *pt)
{
free(pt);
}
init申请内存,destroy释放内存。
先确定内存会因为调用init而增加,测试代码如下(Python):
$ cat mem_test.py
import struct
from ctypes import *
cc = CDLL('./ccc.so')
cc.init.restype = POINTER(c_char*12)
@profile
def test():
for i in range(50000):
p = cc

本文通过测试说明,在Python中调用C函数申请的内存,必须通过C函数的释放接口来释放,Python的`del`语句无法释放C函数malloc的内存。测试使用了`ctypes`和`memory_profiler`模块,结果显示,只有调用`destroy`函数内存才会被正确释放。
最低0.47元/天 解锁文章
419

被折叠的 条评论
为什么被折叠?



