删除Python对象时,Ctypes结构和指针是否会自动释放内存?
在使用Python CTypes时,有一些结构允许您在Python端克隆c结构,还有一些指针对象,它们从内存地址值创建一个结构化Python对象,并可用于通过引用在c代码之间来回传递对象 我在文档或其他地方找不到的是,当一个Python对象本身被删除时会发生什么情况,该对象包含一个结构类,该结构类是从C代码返回的指针(即,该结构的C函数指定内存)中被取消引用的。原始C结构的内存是否已释放?如果没有,怎么做 此外——如果结构本身包含指向其他数据的指针,而这些数据也是由C函数分配的,该怎么办?删除结构对象是否会释放其成员上的指针?(我怀疑是这样)否则——怎么做?对我来说,试图从Python中为结构中的指针调用系统“free”会使Python崩溃 换句话说,我用一个c函数调用来填充这个结构:删除Python对象时,Ctypes结构和指针是否会自动释放内存?,python,ctypes,Python,Ctypes,在使用Python CTypes时,有一些结构允许您在Python端克隆c结构,还有一些指针对象,它们从内存地址值创建一个结构化Python对象,并可用于通过引用在c代码之间来回传递对象 我在文档或其他地方找不到的是,当一个Python对象本身被删除时会发生什么情况,该对象包含一个结构类,该结构类是从C代码返回的指针(即,该结构的C函数指定内存)中被取消引用的。原始C结构的内存是否已释放?如果没有,怎么做 此外——如果结构本身包含指向其他数据的指针,而这些数据也是由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
和pix2
超出范围。当这种情况发生时,如果内部指针指向动态内存,则内部指针不会发生任何变化(就像这里的pix2
而不是pix1
),您负责释放它
解决这个问题的正确方法是,如果在C代码中分配动态内存,那么应该提供相应的函数来释放该内存。例如:
void freepix(PIX *pix)
{
free(pix->text);
}
pix2 = PIX()
mylib.testfunc2(ctypes.byref(pix2))
...
mylib.freepix(ctypes.byref(pix2))