【发布时间】:2011-12-02 09:41:15
【问题描述】:
我有一个类 B,它通过一些虚函数继承了类 A。 B 类还有一个似乎没有地址的虚函数(foo)。当我使用调试器时,它指出 foo 具有0x00000000 地址,当我尝试介入时,它将在0x00000005 出现访问冲突而失败。如果我使该功能不是虚拟的,则调试器会介入并可以正常工作,直到我达到std::vector。在那里,当我调用push_back 时,它会在地址0x000000005 处写一些东西,同时在地址0xabababab 处写一些东西时会失败,并且调用堆栈指向插入函数中的互斥锁。
注意:我没有使用任何其他线程,每次编译时增量链接器都会崩溃。只有完整的链接器才能成功创建 exe。编译器来自 Visual Studio 2008 pro,当剥离未使用的源文件和源代码时开始出现此问题。
很遗憾,我无法恢复到以前的状态,以便发现造成这种情况的变化。
如何在不恢复整个项目的情况下检测问题的根源?也有人遇到过这种错误,可能是同一个原因。
【问题讨论】:
-
给我们一些代码。
-
最可能的原因是您通过空指针调用成员函数。
-
我正在使用调试器,但它没有给我任何相关信息。指针不为空,不幸的是我不能给你任何源代码。
-
您的代码中的其他地方可能出现问题,并覆盖了您的一个对象中的 vtable 指针。如果在特定对象中调用函数时可以可靠地重现它,请在创建该对象后立即设置断点,然后为该对象上的 vtable 指针设置观察点(您可能必须检查内存位置 - 不要'不记得 Visual C++ 调试器是否将 vtable 指针作为成员公开),并且一旦内存覆盖代码运行,您应该触发该观察点。
-
...如果这不起作用,我捕获内存损坏错误的标准解决方案是在 Linux and use valgrind 下编译它以在错误发生时捕获它们。当然,这确实需要您首先编写代码,以便它可以跨平台编译。
标签: c++ linker runtime linker-errors