gpt4 book ai didi

python - 删除 Python 对象时,Ctypes Structures 和 POINTERS 是否会自动释放内存?

转载 作者:太空狗 更新时间:2023-10-29 18:29:10 26 4
gpt4 key购买 nike

当使用 Python CTypes 时,有结构允许您在 Python 端克隆 c 结构,还有 POINTERS 对象从内存地址值创建一个复杂的 Python 对象,并可用于通过引用传回对象等等 C 代码。

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

此外——如果 Structure 本身包含指向也由 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))

然后在某个时候,pix1pix2 超出范围。当这种情况发生时,内部指针不会发生任何变化——如果它们指向动态内存(就像这里的 pix2不是 pix1 的情况) ,您有责任释放它。

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

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


pix2 = PIX()
mylib.testfunc2(ctypes.byref(pix2))
...
mylib.freepix(ctypes.byref(pix2))

关于python - 删除 Python 对象时,Ctypes Structures 和 POINTERS 是否会自动释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4551436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com