删除Python对象时,Ctypes Structures和POINTERS会自动释放内存吗?

时间:2010-12-29 04:18:55

标签: python ctypes

使用Python CType时,有结构,允许您在Py​​thon端克隆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代码中消耗的内存。

1 个答案:

答案 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))

然后在某些时候,pix1pix2超出了范围。当发生这种情况时,内部指针没有任何反应 - 如果它们指向动态内存(如pix2 pix1的情况),则您负责释放它

解决此问题的正确方法是,如果在C代码中分配动态内存,则应提供解除该内存释放的相应函数。例如:

void freepix(PIX *pix)
{
    free(pix->text);
}


pix2 = PIX()
mylib.testfunc2(ctypes.byref(pix2))
...
mylib.freepix(ctypes.byref(pix2))
相关问题