使用Python的CFFI进行内存管理和析构函数/ free()的约定?

如果我要包装一个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)

这里的最佳做法是什么?

最佳答案 看起来像ffi.gc()是要走的路.这是我写的小包装器,它也进行了后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)
点赞