c++罕见的运行时错误

C++ rare runtime error

本文关键字:运行时错误 c++      更新时间:2023-10-16

我有一个类B,它继承了类a和一些虚函数。类B也有一个虚函数(foo),它似乎没有地址。当我与调试器一起行走时,它指出foo有0x00000000地址,当我试图进入时,它会因0x00000005的访问违规而失败。如果我使该功能不是虚拟的调试器步骤,并将工作良好,直到我达到std::vector。在那里,当我调用push_back时,它将在地址0x000000005上以相同的访问冲突失败,同时在地址0xabababab上写一些东西,并且调用堆栈指向插入函数中的互斥锁。

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

不幸的是,我无法恢复到以前的状态,以便发现创建此状态的更改。

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

你猜虚表坏了,但这不太可能,因为虚表通常存储在只读内存中。

对于这种行为,我可以想到两个原因:
  • 您正在使用的对象已被删除。如果对象曾经在内存中,它可能会偶然工作,但如果它被覆盖,它就会失败。
  • 您正在使用的对象不是动态类型b,可能是类型A,或者可能是不相关的类型。

我已经用printf调试成功地跟踪了这类问题:在B的构造函数、析构函数、虚函数和失败函数中添加几行printf("XXX %p", this);,您将能够推断出发生了什么。

是的,我知道,printf调试不酷…

您正在空指针上调用虚函数。编译器添加的代码将使用对象中的隐藏指针来定位什么是最终重写,而该操作失败。当您将该函数更改为非虚函数时,将静态地调度调用,但是由于this指针为空,对成员的访问再次失败。

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