C ++罕见的运行时错误

时间:2011-12-02 09:41:16

标签: c++ linker runtime linker-errors

我有一个B类,它继承了带有一些虚函数的A类。 B类也有一个似乎没有地址的虚函数(foo)。当我使用调试器时,它指出foo具有0x00000000地址,当我尝试介入时,它会因0x00000005处的访问冲突而失败。如果我使该功能不是虚拟的,调试器会介入并且在我到达std::vector之前工作正常。当我调用push_back时,在地址0x000000005处写入一些内容时,地址0xabababab会发生相同的访问冲突,并且调用堆栈指向插入函数中的互斥锁。 / p>

注意:我没有使用任何其他线程,每次编译时增量链接器都会崩溃。只有完整的链接器才能成功创建exe。编译器来自Visual Studio 2008 pro,当剥离未使用的源文件和源代码时,这个问题开始出现。

不幸的是,我无法恢复到之前的状态,以便发现造成这种情况的变化。

如何在不恢复整个项目的情况下检测问题的根源?也有人遇到过这种错误,也许可能是同样的原因。

2 个答案:

答案 0 :(得分:2)

您正在空指针上调用虚函数。编译器添加的代码将使用对象中的隐藏指针来定位最终的覆盖者,并且该操作失败。当您将函数更改为非虚拟时,将静态调度该调用,但同样,由于this指针为空,对成员的访问会失败。

您应该检查在代码中调用方法的对象的有效性。

答案 1 :(得分:2)

您猜测虚拟表已损坏,但这不太可能,因为vtable通常存储在只读内存中。

我可以想到这种行为的两个原因:

  • 您正在使用的对象已被删除。如果对象曾经存在的内存可能会偶然发生,但如果它被覆盖则会失败。
  • 您使用的对象不是动态类型B.可能是A类型,也可能是不相关类型。

我已经使用 printf debugging 成功跟踪了这类问题:在B的构造函数中添加了几行printf("XXX %p", this);,析构函数,虚函数和失败函数,以及你将能够推断出正在发生的事情。

是的,我知道, printf debugging 并不酷......