我有一個使用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