Соглашения по управлению памятью и деструкторам / free() с Python CFFI?
Если я обертываю класс C:
from ._ffi import ffi, lib
class MyClass(object):
def __init__(self):
self._c_class = lib.MyClass_create()
Каковы лучшие практики для того, чтобы убедиться, что lib.MyClass_destroy(…)
называется?
Есть ли cffi
иметь какую-то оболочку вокруг объектов, которая будет вызывать деструктор, когда объект Python имеет GC, например что-то вроде:
my_obj = managed(lib.MyClass_create(), destructor=lib.MyClass_destroy)
Или эта логика деструктора должна быть в классе __del__
? Что-то вроде:
class MyClass(object):
def __del__(self):
if self._c_class is not None:
lib.MyClass_destroy(self._c_class)
Каковы лучшие практики здесь?
1 ответ
Это выглядит как ffi.gc()
это путь Это небольшая оболочка, которую я написал, которая также выполняет post-malloc NULL
проверять:
def managed(create, args, free):
o = create(*args)
if o == ffi.NULL:
raise MemoryError("%s could not allocate memory" %(create.__name__, ))
return ffi.gc(o, free)
Например:
c_class = managed(lib.MyClass_create, ("some_arg", 42),
lib.MyClass_destroy)