2013-09-28 16 views
1

我正在編寫一個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)

+0

我認爲這是公平地說,你的類是*不*一個的PyObject如果在不相關的結構在對象的內存... –

+0

@oli它看起來像一個的PyObject和叫聲也像的PyObject的開始。我認爲這個問題恰恰相反:一旦python做了骯髒的工作,它就不是C++虛擬後代類實例。 – amwinter

+0

爲什麼讓你的類成爲PyObject很重要?爲什麼你不能有一個以PyObject_HEAD開頭的數據成員? – pts

回答

0

Python不知道C++但它確實知道的結構。所以Python會調用一個純C函數來創建一個結構。相反,結構有一個指向C++對象的指針。這樣Python就可以看到一個純粹的C接口,但C接口的實現會創建一個私有內部對象。

我們實際上是在我的一個項目中做到這一點。它的工作原理,它非常便攜。

+0

這是合法的,我做了類似的事情,但我正在尋找第三個選項 - 可能是一個功能,它告訴python類的PyObject_HEAD的真正偏移量。 – amwinter