c++ - 运行时 "can' t 找到虚拟表的链接器符号的原因可能是什么...“Qt 中的错误?

标签 c++ qt linker vtable

这个问题被多次以类似的方式提出,例如 stackoverflowforum.qt.ioqtcentre.org .问题在于此错误消息非常模糊,以至于无法将一种解决方案应用于另一种情况。虽然大多数线程都死在讨论的中间 :-(

所以我在 Qt 应用程序中得到的完整错误消息是:

找不到“OneOfMyClasses”值的虚拟表的链接器符号
找到了“QString::shared_null”

OneOfMyClasses 会根据各种情况发生变化,QString::shared_null 对于我遇到的所有错误都保持不变。这是我的日志控制台的屏幕截图:

enter image description here

  1. 为什么字体颜色是粉红色,那么是谁在打印这条消息?
  2. 为什么我只在设置断点并单步执行代码时看到此消息?仅运行应用程序时不会出现此消息。

它发生的点是在当前位置(黄色箭头)之前的源代码行中的这个函数中:

enter image description here

因此根据消息,我进入了m_pStateWidget->insertNavLabel(...),错误消息打印在Qt 内部与QString 类相关的构造函数中的某处。所以我尝试了以下方法,将问题从这个代码位置移开:

enter image description here

执行此操作时,我在下面的几行代码中收到相同的错误消息,消息中有另一个类名,请注意 QString::shared_null 保持不变。

在我看来,我有某种损坏的内存。

  1. 我应该如何开始调查这个问题?我不敢更改代码,因为这可能会隐藏上述问题。
  2. QString::shared_null 怎么了?我发现其他人经常在他们的错误消息中看到相同的内容。

感谢您的任何提示或帮助! :-)

编辑:现在变得非常有趣了。在打印消息之前,我已经进入了每一个功能,但最终得到了这些错误消息:

enter image description here

在这个位置:

enter image description here

当我在 QtCreator 中浏览调用堆栈时,每次我在堆栈中选择另一个函数时都会一次又一次地打印错误。

  1. 这是否意味着调试器正在打印消息并且它太愚蠢而无法为我解决某种 vtable 问题,或者这是否意味着我遇到了严重的问题?

最佳答案

原因: 在您的代码中的某处,您可能超出了实际内存

示例 1:

int elmArray[10];
for(int i = 0; i < 20; ++i)
{
elmArray[i] = 0;
}

在上面的例子中,实际的数组大小是 10,但是我们给索引赋值超过了 10。

示例 2:

char* cpyString;

strcpy(cpyString , "TEST");

这些场景可能最终会将值写入其他对象。大多数情况下可能会损坏虚拟表。这会给出上述警告。

修复: 如您所知,只需更正以下代码即可。 示例:

int elmArray[10];
for(int i = 0; i < 10; ++i)
{
elmArray[i] = 0;
}

char cpyString[10];
strcpy(cpyString , "TEST");

在您的情况下,您似乎正在将 QTString::shared_null 分配给一些未初始化的字符串。

关于c++ - 运行时 "can' t 找到虚拟表的链接器符号的原因可能是什么...“Qt 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35171310/

相关文章:

c++ - 根据初始列的值更改表格颜色

C 中的交叉引用库和链接

c - 链接一个特殊的共享库

c++ - 函数级静态变量 NOT static 用于惰性簿记

c++ - 如何有选择地为 VS2010 构建 Qt?

c++ - 模拟左键点击时黑屏

qt - TextField 的安全文本输入

ios - Mach-O 链接器警告 : too many personality routines for compact unwind to encode

C++ 按数字比较两个数字

java - 将图像从android studio发送到cpp