1

我正在编写一个 C++ python 扩展,每当我(从 C++)调用某个类的虚拟继承方法时,我一直在体验 SIGSEGV,该类也是一个 PyObject(即它有一个 PyObject_HEAD)。

我终于想起python对C++一无所知。果然,GCC 在我的对象的前 4 个字节中放置了一个 vtable 指针(你可以看出,因为 PyObject_HEAD 的第一个字段是从对象地址偏移 4 个字节)。当 python INCREFs 对象时,它实际上是在改变 vtable 指针。

我的问题:我应该怎么做才能解决这个问题?将虚方法移到子类中可以解决问题,但似乎认输了。还有其他想法/经验吗?

(mingw32 / windows 7 上的 Python 2.7、GCC 4.7.2)

4

1 回答 1

0

Python 不了解 C++,但它确实了解结构。所以让 Python 调用一个纯 C 函数来创建一个结构。相反,该结构有一个指向 C++ 对象的指针。这样 Python 看到的是纯 C 接口,但 C 接口的实现会创建一个私有内部对象。

我们实际上是在我的一个项目中这样做的。它可以工作并且非常便携。

于 2013-09-29T03:05:58.247 回答