我想导出一个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包装器总是一个好主意(处理引用计数)