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

Does Cython have something like std::unique_ptr?

Cython 是否有办法包装 malloc 的值以便它们得到 GC?

我要这样做:

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

这里有一个论坛 post 可以达到这个目的:https://mail.python.org/pipermail/cython-devel/2012-June/002734.html

鉴于 Cython 是什么,我假设有一个我只是不知道的内置解除分配包装器。

PyCapsule 有点难看,因为你必须为每个 class 定义一个析构函数,但它确实有效:

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)

可能有一种方法可以做到这一点 'more automatically' 通过在 C++ 中定义一个模板来制造自己的析构函数。然后可以在 cython 中实例化该类型。