当前位置: 首页 > 面试题库 >

删除对象时无法调用__dealloc__

萧晔
2023-03-14
问题内容

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

我在网上找不到类似的问题。你们中有人有在这里出现过的想法吗?

我缺少有关引用计数管理的信息,或者…

非常感谢


问题答案:

del a_set删除对对象的引用(局部变量)。C ++对象中还有另一个参考。这称为参考周期。循环GC 可能会
在一段时间后收集此信息。然而,没有保证时(甚至 如果 )出现这种情况,所以你不应该依赖于它1。

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

在版本3.4中进行了更改:在PEP 442之后,带有__del__()方法的对象gc.garbage不再存在。

我不知道Cython的实现__dealloc__是否会触发此行为,但是如前所述,销毁无论如何都不是确定性的。如果您要释放一些资源(例如,不是Python对象的内存块,文件,连接,锁等),则应公开一种明确的手动方式(参见close各种方法)对象)。上下文管理器可以简化客户端代码。

免责声明:几乎所有这些都是CPython特定的。

1有些人更喜欢将html" target="_blank">GC看作是模拟无限内存可用性的抽象,而不是破坏无法访问的对象的抽象。通过这种方法,很明显破坏不是确定性的,甚至无法保证。



 类似资料:
  • 问题内容: 假设我有一个这样的架构: 如果删除一个人,那么仍然存在孤立的作业,这些作业引用了一个不存在的人,这在数据库中造成了混乱。 有没有一种简单的方法来确保删除一个人时,对该人的所有相应引用也将被删除? 问题答案: 您可以在架构上添加自己的Mongoose 中间件,以将该人从引用该人的所有其他文档中删除。在中间件功能中,就是要删除的文档。

  • 我有以下型号: 当我运行下面的查询时,用户模型也被删除 有没有办法在不删除用户的情况下删除问题? 我试着重复这些问题但没有用 我认为查询集是懒惰的,所以也许我需要在删除之前评估它,所以我打印了它,但这不起作用。 我知道,将ForeignKey设置为null将为我提供诸如clear和remove之类的方法,但我不想这样做,因为我不希望出现任何孤立的用户问题。 我更新了ForeignKey,如下所示

  • 问题内容: 这是使用for每个循环从Java中的LinkedList中查找和删除项目的有效方法,是否可能会导致不一致: 问题答案: 其他人提到有效点,通常这不是您如何从集合中获取对象。但是,在这种情况下,因为您一旦退出循环就可以了。 但是,如果要在之后继续迭代,则需要使用迭代器。否则,您将获得,或更普遍的情况是未定义的行为。 所以,是的, 如果您不在别人之后,您会没事的。 对于那些说这将失败的人来

  • 问题内容: 我想从对象中删除时间。 但是,当我转换此日期(格式)时,它也在附加时间。 我根本不想要时间。我想要的只是“ 21/03/2012”。 问题答案: 快速答案是: 不,您不能这样做。 因为那是用来干什么的。 来自的javadoc : Date类表示特定的时间瞬间,精度为毫秒。 但是 ,由于此类仅是数据对象。它不在乎我们如何描述它。当我们看到日期时,可以说是,这就是您所需要的。有很多方法可以

  • 问题内容: 我想将表拖放到数据库中。但是,例如,当我使用时, 会收到以下消息: 我发现解决方案是删除所有数据库。但是,无论如何,如何在不完全删除数据的情况下解决此问题? 问题答案: 使用选项: 这将删除引用该表或使用该表的任何视图的任何外键。 它不会删除其他 表 (或从中删除行)。

  • 问题内容: 我知道这是一个杂乱的实现,但是我基本上有这段代码(我全部写了),使用适当的菜单选项时,我需要能够从列表中删除一名学生或教师。代码中的所有其他内容都起作用,但菜单选项3和4无效。我尝试删除该对象时输入的是完全相同的信息。这是代码。这三个类别都在下面。 驱动类别: 学生班: 讲师课程: 问题答案: 您必须正确覆盖和类的方法。 覆盖等于时,也应覆盖。新学生(姓名,ID,GPA); 例如,如下