ctypes内存管理:如何及何时释放分配的资源?

11 投票
1 回答
5484 浏览
提问于 2025-04-15 14:28

我正在用Ctypes在Python中为一个C库写一个小的包装器,但我不确定从Python分配的结构体在超出作用域后是否会自动释放。

举个例子:

from ctypes import *
mylib = cdll.LoadLibrary("mylib.so")

class MyPoint(Structure):
    _fields_ = [("x", c_int), ("y", c_int)]

def foo():
    p = MyPoint()
    #do something with the point

foo()

在foo函数返回后,那指针还会“活着”吗?我需要调用 clib.free(pointer(p)) 来释放它吗?或者Ctypes有没有提供一个函数来释放为C结构体分配的内存?

1 个回答

5

在这种情况下,你的 MyPoint 实例是一个在 Python 堆上分配的对象,所以不需要特别对待它,和其他 Python 对象一样就可以了。不过,如果你是通过调用 mylib.so 中的 allocate_point() 来获得这个 MyPoint 实例,那么你就需要使用提供的某个函数来释放它,比如在 mylib.so 中的 free_point(p)

撰写回答