为什么Python函数会被垃圾回收?

2024-05-13 15:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用Python回调的C++库。回调,即PyObject*,存储在UnaryFunction类的一个对象中,构造函数Py峈会增加它。毁灭者Py xdecref它。这就是问题所在。口译员在那个减速机上出错了。在

我的解决办法是不减少它,但这似乎是错误的。 增加/减少一个函数的引用计数的正确方法是什么?更重要的是,为什么解释器在有其他实时引用的情况下尝试GC函数体?在

编辑:在Linux上,我得到的不是segfault的断言fail,它说:

python: Objects/funcobject.c:442: func_dealloc: Assertion 'g->gc.gc_refs != (-2)' failed.


Tags: 对象方法函数py错误解释器gc计数
2条回答

崩溃并不意味着它正在尝试GC一个已使用的对象。这也可能意味着您调用的python代码没有解释器锁。在

在析构函数中调用Py XDECREF会让我觉得你有这样的情况:

void MyCallback(myfunc, myarg)
{
    ...
    PyGILState_STATE gilstate = PyGILState_Ensure();
    try {
            myfunc(myarg);
    } catch (...) {
        ...
    }
    PyGILState_Release(gilstate);

    // myfunc goes out of scope here  > CRASH because we no longer own the GIL
}

简单的解决方案是:

^{pr2}$

似乎Py_INCREF实际上并没有增加refcount。在

相关问题 更多 >