我有一个使用Python回调的C++库。回调函数,即PyObject *,存储在UnaryFunction类的对象中,构造函数Py_INCREFs。解析器Py_XDECREFs它。那就是问题所在。该解释器在该DECREF上进行了段错误分析。为什么Python函数会收集垃圾?
我的解决方案是不DECREF它,但这似乎是错误的。 INC/DEC函数的引用计数的正确方法是什么?更重要的是,为什么解释程序在还有其他实时引用时尝试GC函数体?
编辑:在Linux上,而不是一个段错误,我得到的断言失败,说:
python: Objects/funcobject.c:442: func_dealloc: Assertion 'g->gc.gc_refs != (-2)' failed.
这似乎是邮件列表的问题。 Google“Python邮件列表”。在那里你可以找到认识Python的人,有时甚至是Python的创建者/开发者。 –
相关:http://stackoverflow.com/questions/7326762/cython-callback-works-correctly-for-function-but-not-for-bound-method/7339258#7339258 – jfs
@JFSebastian,很好的猜测,但方法并没有超出范围。这个问题在一个简单的平面脚本中展示,它带有一个简单的'def myfunc(x):“。如果我注释掉使用回调的部分,那么我可以在脚本的末尾调用myfunc()。 – Adam