我正在編寫一個C++ python擴展,每當我調用(從C++)一個虛擬繼承的方法的某個類也遇到過SIGSEGV, PyObject(即它有一個PyObject_HEAD)。我認爲python覆蓋了我的vtable(C++擴展)
我終於想起python對C++一無所知。果然,GCC在我的對象的前4個字節中放置了一個vtable指針(你可以這麼說,因爲PyObject_HEAD的第一個字段偏離了對象地址的4個字節)。當python INCREFs對象時,它實際上改變了vtable指針。
我的問題:我應該怎麼做才能解決這個問題?將虛擬方法轉移到一個輔助類將解決它,但它似乎承認失敗。任何其他想法/經驗?
(Python 2.7版,上的mingw32 /視窗7 GCC 4.7.2)
我認爲這是公平地說,你的類是*不*一個的PyObject如果在不相關的結構在對象的內存... –
@oli它看起來像一個的PyObject和叫聲也像的PyObject的開始。我認爲這個問題恰恰相反:一旦python做了骯髒的工作,它就不是C++虛擬後代類實例。 – amwinter
爲什麼讓你的類成爲PyObject很重要?爲什麼你不能有一個以PyObject_HEAD開頭的數據成員? – pts