Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除Python对象时,Ctypes结构和指针是否会自动释放内存?_Python_Ctypes - Fatal编程技术网

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

删除Python对象时,Ctypes结构和指针是否会自动释放内存?,python,ctypes,Python,Ctypes,在使用Python CTypes时,有一些结构允许您在Python端克隆c结构,还有一些指针对象,它们从内存地址值创建一个结构化Python对象,并可用于通过引用在c代码之间来回传递对象 我在文档或其他地方找不到的是,当一个Python对象本身被删除时会发生什么情况,该对象包含一个结构类,该结构类是从C代码返回的指针(即,该结构的C函数指定内存)中被取消引用的。原始C结构的内存是否已释放?如果没有,怎么做 此外——如果结构本身包含指向其他数据的指针,而这些数据也是由C函数分配的,该怎么办?删除结

在使用Python CTypes时,有一些结构允许您在Python端克隆c结构,还有一些指针对象,它们从内存地址值创建一个结构化Python对象,并可用于通过引用在c代码之间来回传递对象

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

此外——如果结构本身包含指向其他数据的指针,而这些数据也是由C函数分配的,该怎么办?删除结构对象是否会释放其成员上的指针?(我怀疑是这样)否则——怎么做?对我来说,试图从Python中为结构中的指针调用系统“free”会使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
pix2
超出范围。当这种情况发生时,如果内部指针指向动态内存,则内部指针不会发生任何变化(就像这里的
pix2
而不是
pix1
),您负责释放它

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

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


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