Cython是否有办法将malloc'd值包装起来以便GC得到它们?
答案 0 :(得分:0)
我跟这个:
cdef class AutoPtr:
cdef void* _ptr
def __cinit__(self): self._ptr = NULL
def __dealloc__(self):
if self._ptr: mem.PyMem_Free(self._ptr) # or whatever free function is relevant to your codebase
self._ptr = NULL
cdef AutoPtr mkauto(void* ptr):
cdef AutoPtr wrapper = AutoPtr()
wrapper._ptr = ptr
return wrapper
我认为__cinit__
强制它的参数是python对象,所以像这样的东西甚至不会编译:
cdef class AutoPtr:
cdef void* _ptr
def __cinit__(self, void* ptr): self._ptr = ptr
def __dealloc__(self): pass # etc
这是一个论坛帖子:https://mail.python.org/pipermail/cython-devel/2012-June/002734.html
鉴于Cython是什么,我假设有一个我不知道的内置解除分配包装。
答案 1 :(得分:0)
PyCapsule有点难看,因为你必须为每个类定义一个析构函数,但它可以解决这个问题:
from cpython cimport pycapsule
cdef const char* CAPNAME = "ExtClassName"
cdef void del_capsule(object o):
cdef ExtClass* cobject = <ExtClass*>pycapsule.PyCapsule_GetPointer(o, CAPNAME)
del cobject
def mk_cpp_object():
return pycapsule.PyCapsule_New(cp, CAPNAME, del_capsule)
可能有一种方法可以更自动地实现这一目标&#39;通过在C ++中定义一个生成自己的析构函数的模板。然后可以在cython中实例化该类型。