当使用Python CTypes时,有结构,允许您在Python端克隆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)
然后在某一点,pix1而pix2走出去的范围.当发生这种情况时,内部指针没有任何反应 - 如果它们指向动态内存(就像这里的情况一样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)
| 归档时间: |
|
| 查看次数: |
3925 次 |
| 最近记录: |