由cdef public函数创建的PyObject*的引用计数是否应该手动减少?



我想导出一个python类在c++中使用:

class Object:
def method(self):
pass

cdef public object create_object() with gil:
return Object()
cdef public void py_method(object obj) with gil:
obj.method()  # obj is expected to have method()

那么生成的头文件将具有以下功能:

__PYX_EXTERN_C PyObject *create_object(void);
__PYX_EXTERN_C void py_method(PyObject *);

我的问题是:我也应该有一个函数像

from cpython cimport Py_XDECREF, PyObject
cdef public void destroy_object(PyObject* obj) with gil:
Py_XDECREF(obj)

避免内存泄漏?

这些函数可以在c++代码中使用,如:
auto obj = create_object()
py_method(obj)
// Finally
destroy_object(obj)

是的,在c++中调用它时应该递减它。你可以按照你建议的方式来做,或者你可以跳过destroy_object的定义,在c++中只使用Py_XDECREF

你应该考虑的其他事情:

  • create_object可以返回NULL,如果它引发了一个Python异常,所以检查
  • RAII包装器总是一个好主意(处理引用计数)

相关内容

  • 没有找到相关文章

最新更新