删除对象时,我不能让__dealloc__被称为(I can't get __dealloc

2019-08-22 09:04发布

我有以下的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

我不能在网上找到类似的问题。 是否有任何人都有在这里被appening我的想法?

我我失去了一些东西约引用计数管理,或...

非常感谢

Answer 1:

del a_set移除到的对象的引用(局部变量)。 还有另一种参考,在C ++对象。 这被称为一个参考周期。 循环GC 可能经过一段时间收集这些。 然而,没有保证时(或者即使 )出现这种情况,所以你不应该依赖于它1。

例如,含有纯Python对象与参考周期__del__特殊方法都记录到不被在所有释放:

改变在3.4版本:继PEP 442,对象与__del__()方法在没有最终gc.garbage了。

我不知道是不是用Cython的实施__dealloc__触发这种行为,但正如前面所述,破坏不确定性的反正。 如果你想释放一些资源(如内存块,是不是一个Python对象,文件,连接,锁等),你应该揭露手动这样做(参见的明确方式close的方法各种物体)。 上下文管理器可以简化客户端代码这样做。

免责声明:几乎所有的这是CPython的特异性。

1有些人喜欢GC的思想作为模拟无限怀念的可用性,而不是东西,破坏可达对象的抽象。 通过这种方法,它变得很明显的破坏是不确定性的,甚至不能保证。



文章来源: I can't get __dealloc__ be called when deleting an object