Qt 中运行时“找不到虚拟表的链接器符号...”错误的原因是什么?

Fro*_*zan 5 c++ linker qt vtable

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

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

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

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

在此输入图像描述

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

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

在此输入图像描述

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

在此输入图像描述

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

在我看来,我的记忆有某种损坏。

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

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

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

在此输入图像描述

在这个位置:

在此输入图像描述

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

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

Raa*_*ams 2

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

示例1:

int elmArray[10];
for(int i = 0; i < 20; ++i)
{
elmArray[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,实际数组大小为 10,但我们为索引分配的值超过 10。

示例2:

char* cpyString;

strcpy(cpyString , "TEST");
Run Code Online (Sandbox Code Playgroud)

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

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

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

char cpyString[10];
strcpy(cpyString , "TEST");
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您将 QTString::shared_null 分配给某个未初始化的字符串。