我认为python正在覆盖我的vtable(c ++扩展)

时间:2013-09-28 23:29:24

标签: c++ python

我正在编写一个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)

1 个答案:

答案 0 :(得分:0)

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

我们实际上是在我的一个项目上执行此操作。它很有效,而且很便携。