使用Python CType时,有结构,允许您在Python端克隆c结构,以及POINTERS对象从内存地址值创建一个软化的Python对象,并可用于通过引用传递对象C代码。
我在文档或其他地方找不到的是当包含从C代码的返回指针中取消引用的Structure类的Python对象(即 - 结构的C函数分配的内存)时会发生什么本身已删除。是否释放了原始C结构的内存?如果没有怎么办?
此外 - 如果结构包含指针本身,还有由C函数分配的其他数据,该怎么办?删除Structure对象是否释放了Pointers onits成员? (我对此表示怀疑)否则 - 如何做到这一点?尝试从Python中为结构中的指针“免费”调用系统,这对我来说是崩溃的。
换句话说,我通过c函数调用填充了这个结构:
class PIX(ctypes.Structure):
"""Comments not generated
"""
_fields_ = [
("w", ctypes.c_uint32),
("h", ctypes.c_uint32),
("d", ctypes.c_uint32),
("wpl", ctypes.c_uint32),
("refcount", ctypes.c_uint32),
("xres", ctypes.c_uint32),
("yres", ctypes.c_uint32),
("informat", ctypes.c_int32),
("text", ctypes.POINTER(ctypes.c_char)),
("colormap", ctypes.POINTER(PIXCOLORMAP)),
("data", ctypes.POINTER(ctypes.c_uint32))
]
我想释放它从Python代码中消耗的内存。
答案 0 :(得分:11)
内存未被释放,因为Python不知道是否应该释放它或如何释放它。比较这两个函数:
void testfunc1(PIX *pix)
{
static char staticBuffer[256] = "static memory";
pix->text = staticBuffer;
}
void testfunc2(PIX *pix)
{
pix->text = (char *)malloc(32);
strcpy(pix->text, "dynamic memory");
}
像这样使用:
pix1, pix2 = PIX(), PIX()
mylib.testfunc1(ctypes.byref(pix1))
mylib.testfunc2(ctypes.byref(pix2))
然后在某些时候,pix1
和pix2
超出了范围。当发生这种情况时,内部指针没有任何反应 - 如果它们指向动态内存(如pix2
但不 pix1
的情况),则您负责释放它
解决此问题的正确方法是,如果在C代码中分配动态内存,则应提供解除该内存释放的相应函数。例如:
void freepix(PIX *pix)
{
free(pix->text);
}
pix2 = PIX()
mylib.testfunc2(ctypes.byref(pix2))
...
mylib.freepix(ctypes.byref(pix2))