我有一个B类,它继承了带有一些虚函数的A类。 B类也有一个似乎没有地址的虚函数(foo)。当我使用调试器时,它指出foo具有0x00000000
地址,当我尝试介入时,它会因0x00000005
处的访问冲突而失败。如果我使该功能不是虚拟的,调试器会介入并且在我到达std::vector
之前工作正常。当我调用push_back
时,在地址0x000000005
处写入一些内容时,地址0xabababab
会发生相同的访问冲突,并且调用堆栈指向插入函数中的互斥锁。 / p>
注意:我没有使用任何其他线程,每次编译时增量链接器都会崩溃。只有完整的链接器才能成功创建exe。编译器来自Visual Studio 2008 pro,当剥离未使用的源文件和源代码时,这个问题开始出现。
不幸的是,我无法恢复到之前的状态,以便发现造成这种情况的变化。
如何在不恢复整个项目的情况下检测问题的根源?也有人遇到过这种错误,也许可能是同样的原因。
答案 0 :(得分:2)
您正在空指针上调用虚函数。编译器添加的代码将使用对象中的隐藏指针来定位最终的覆盖者,并且该操作失败。当您将函数更改为非虚拟时,将静态调度该调用,但同样,由于this
指针为空,对成员的访问会失败。
您应该检查在代码中调用方法的对象的有效性。
答案 1 :(得分:2)
您猜测虚拟表已损坏,但这不太可能,因为vtable通常存储在只读内存中。
我可以想到这种行为的两个原因:
我已经使用 printf debugging 成功跟踪了这类问题:在B的构造函数中添加了几行printf("XXX %p", this);
,析构函数,虚函数和失败函数,以及你将能够推断出正在发生的事情。
是的,我知道, printf debugging 并不酷......