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

jsb*_*eno 10 python ctypes

当使用Python CTypes时,有结构,允许您在Py​​thon端克隆c结构,POINTERS对象从内存地址值创建一个软化的Python对象,并可用于通过引用来回传递对象C码.

我在文档或其他地方找不到的是当包含一个从C代码的返回指针中取消引用的Structure类的Python对象(即 - 结构的C函数分配的内存)本身被删除时会发生什么.是否释放了原始C结构的内存?如果没有怎么办?

此外 - 如果结构包含指针本身,还有由C函数分配的其他数据,该怎么办?删除Structure对象是否释放了Pointers onits成员?(我对此表示怀疑)否则 - 如何做到这一点?尝试从Python中为结构中的指针"免费"调用系统,这对我来说是崩溃的Python.

换句话说,我通过ac函数调用填充了这个结构:

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))
    ]
Run Code Online (Sandbox Code Playgroud)

我想释放它从Python代码中消耗的内存.

Ada*_*eld 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");
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

pix1, pix2 = PIX(), PIX()
mylib.testfunc1(ctypes.byref(pix1))
mylib.testfunc2(ctypes.byref(pix2))
Run Code Online (Sandbox Code Playgroud)

然后在某一点,pix1pix2走出去的范围.当发生这种情况时,内部指针没有任何反应 - 如果它们指向动态内存(就像这里的情况一样pix2没有 pix1),你有责任释放它.

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

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


pix2 = PIX()
mylib.testfunc2(ctypes.byref(pix2))
...
mylib.freepix(ctypes.byref(pix2))
Run Code Online (Sandbox Code Playgroud)