Fro*_*zan 5 c++ linker qt vtable
这个问题被多次以类似的方式提出,例如在stackoverflow或forum.qt.io或qtcentre.org。问题是这个错误消息非常模糊,以至于一种解决方案无法应用于另一种场景。不过,大多数线程都在讨论中死掉了:-(
所以我在 Qt 应用程序中收到的完整错误消息是:
找不到“OneOfMyClasses”
值的虚拟表的链接器符号,而是找到“QString::shared_null”
OneOfMyClasses根据各种情况而变化,QString::shared_null对于我收到的所有错误保持不变。这是我的日志控制台的屏幕截图:
它发生的点是在当前位置之前的源代码行中的该函数中(黄色箭头):
因此,根据我进入的消息m_pStateWidget->insertNavLabel(...),错误消息打印在与 QString 类相关的 Qt 内的构造函数中的某个位置。所以我尝试了以下方法,将问题从该代码位置移开:
执行此操作时,我在下面的几行代码中收到相同的错误消息,消息中包含另一个类名,请注意 QString ::shared_null保持不变。
在我看来,我的记忆有某种损坏。
感谢您的任何提示或帮助!:-)
编辑:现在变得非常有趣。在打印消息之前我已经进入了每个函数,最终得到了这些错误消息:
在这个位置:
当我在 QtCreator 中浏览调用堆栈时,每次我在堆栈中选择另一个函数时,都会一次又一次地打印错误。
原因: 在代码中的某个地方,您可能超出了实际内存
示例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 分配给某个未初始化的字符串。