1

私は C++ python 拡張機能を作成していますが、PyObject でもある (つまり、PyObject_HEAD を持つ) 特定のクラスの仮想的に継承されたメソッドを (C++ から) 呼び出すたびに、SIGSEGV が発生します。

Python は C++ について何も知らないということをようやく思い出しました。案の定、GCC はオブジェクトの最初の 4 バイトに vtable ポインタを配置しています (PyObject_HEAD の最初のフィールドがオブジェクトのアドレスから 4 バイトオフセットされているため、わかります)。Python がオブジェクトを INCREF すると、実際には vtable ポインターが変更されます。

私の質問: これを修正するにはどうすればよいですか? 仮想メソッドを補助クラスに移動すれば解決しますが、敗北を認めているようです。その他の考え/経験はありますか?

(Python 2.7、mingw32/windows 7 の GCC 4.7.2)

4

1 に答える 1

0

Python は C++ については知りませんが、構造については知っています。したがって、構造体を作成する純粋な C 関数を Python に呼び出させます。代わりに、構造体には C++ オブジェクトへのポインターがあります。このように、Python は純粋な C インターフェースを認識しますが、C インターフェースの実装はプライベートな内部オブジェクトを作成します。

私たちは実際に私のプロジェクトの1つでこれを行います. それは機能し、かなり移植性があります。

于 2013-09-29T03:05:58.247 に答える