Соглашения по управлению памятью и деструкторам / 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)
Другие вопросы по тегам