当Python对象被删除时,Ctypes结构和指针是否自动释放内存?

2023-11-25

使用 Python CType 时,存在允许您在 Python 端克隆 C 结构的结构,以及从内存地址值创建复杂 Python 对象并可用于通过引用来回传递对象的 POINTERS 对象 C代码。

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

此外,如果结构本身包含指向也由 C 函数分配的其他数据的指针,该怎么办?删除 Structure 对象是否会释放其成员上的指针? (我怀疑是这样)否则- -怎么办?尝试将结构中的指针从 Python 中“释放”出来,这对我来说会让 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 代码中释放它正在使用的内存。


内存没有被释放,因为 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 and pix2超出范围。当这种情况发生时,内部指针不会发生任何变化——如果它们指向动态内存(就像这里的情况一样)pix2 but not pix1),您有责任释放它。

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

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


pix2 = PIX()
mylib.testfunc2(ctypes.byref(pix2))
...
mylib.freepix(ctypes.byref(pix2))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当Python对象被删除时,Ctypes结构和指针是否自动释放内存? 的相关文章

随机推荐