Cython有类似std :: unique_ptr的东西吗?

时间:2015-01-16 06:11:08

标签: python cython unique-ptr

Cython是否有办法将malloc'd值包装起来以便GC得到它们?

2 个答案:

答案 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中实例化该类型。