我正在编写一个C ++ python扩展,每当我调用(来自C ++)一个特定类的虚拟继承方法(也就是PyObject_HEAD)时,我一直在体验一个SIGSEGV。
我终于记得python对C ++一无所知。果然,GCC在我的对象的前4个字节中放置了一个vtable指针(你可以说,因为PyObject_HEAD的第一个字段偏离了对象地址的4个字节)。当python INCREF对象时,它实际上正在改变vtable指针。
我的问题:我该怎么做才能解决这个问题?将虚拟方法移动到子类可以解决它,但它似乎承认失败。还有其他想法/经历吗?
(mingw32 / windows 7上的Python 2.7,GCC 4.7.2)
答案 0 :(得分:0)
Python不了解C ++,但它确实了解结构。因此,Python调用一个创建结构的纯C函数。相反,该结构具有指向C ++对象的指针。这样Python就可以看到纯C接口,但C接口的实现会创建一个私有内部对象。
我们实际上是在我的一个项目上执行此操作。它很有效,而且很便携。