【发布时间】:2013-04-05 04:04:29
【问题描述】:
我有以下 C++ 类:
.H
class ALabSet: public LabSet {
public:
PyObject *m_obj;
ALabSet(PyObject *obj);
virtual ~ALabSet();
PyObject *GetPyObj();
};
.CPP
ALabSet::ALabSet(PyObject *obj): LabSet() {
this->m_obj = obj;
// Provided by "cyelp_api.h"
if (import_cyelp()) {
} else {
Py_XINCREF(this->m_obj);
}
}
ALabSet::~ALabSet() {
Py_XDECREF(this->m_obj);
}
PyObject *ALabSet::GetPyObj() {
return this->m_obj;
}
我用 Cython 将其暴露如下:
cdef extern from "adapter/ALabSiteSetsManager.h" namespace "elps" :
cdef cppclass ALabSet:
ALabSet(PyObject *)
PyObject *GetPyObj()
cdef class PyLabSet:
cdef ALabSet *thisptr
def __cinit__(self):
self.thisptr = new ALabSet(<PyObject *>self)
def __dealloc__(self):
print "delete from PY !"
if self.thisptr:
del self.thisptr
我的问题是我不知道如何从 Python 中调用析构函数。以下内容完全没有任何作用:
a_set = PyLabSet()
del a_set
我在网上找不到类似的问题。有没有人想到这里出现在我身边?
我错过了一些关于引用计数管理的内容,或者...
非常感谢
【问题讨论】:
-
您正在创建一个引用循环,我认为,在
self.thisptr = new ALabSet(<PyObject *>self)中,您正在增加类的引用计数。 -
是的,魔法你!我删除了额外的 Py_XINCREF ,它成功了。好想法。谢谢。现在我不记得我在构造函数中做了什么。需要看一下显然由 Cython 生成的“import_cyelp()”,但我不知道它的作用了吗?
-
我遇到了类似的问题,因为我正在创建循环引用。使用
weakref.proxy解决了这个问题,很好地描述了here。
标签: c++ python destructor cython