Управление памятью ctypes: как и когда освободить выделенные ресурсы? - PullRequest
9 голосов
/ 21 сентября 2009

Я пишу небольшую оболочку для библиотеки C на Python с Ctypes, и я не знаю, будут ли структуры, выделенные из 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 Ответ

4 голосов
/ 21 сентября 2009

В этом случае ваш экземпляр MyPoint является объектом Python, размещенным в куче Python, поэтому не нужно обрабатывать его иначе, чем любой другой объект Python. Если, с другой стороны, вы получили экземпляр MyPoint, вызвав, скажем, allocate_point() в mylib.so, вам потребуется освободить его, используя любую функцию, предусмотренную для этого, например, free_point(p) в mylib.so.

...