我尝试在我的应用程序中调试段错误,但无法弄清问题是什么。发布完整代码太复杂了,所以我试着将问题分解成一个更简单的版本 - 只是为了弄清楚我的基本示例是否完美无瑕。
但是,我仍然无法尝试运行我的应用程序,并会感谢以下任何输入 - 非常有帮助 - 错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007fffdd921f38 in main_arena () from /lib/libc.so.6
当我尝试按以下方式调用getType()
时会发生这种情况:
std::map<long, QVAbstractElement *> mElements;
<...>//skipping some stuff
LineElement * insert_el = new LineElement();
mElements[0] = insert_el;
<...>//skipping a lot more stuff
AbstractElement * el = mElements.at(0);
if (!el)
{
printf("ERROR");
return (1);
}
int t = el->getType();
在这种情况下,我知道指针el
是有效的,但实际对象是LineElement
,它来自AbstractElement
而getType()
是{ {1}}函数仅在基类(virtual
)中实现。使用gdb进行调试时,我得到以下指针地址:
AbstractElement
现在,当尝试从gdb调用该函数((gdb) x el
0x11cf600: 0xdd921f48
(gdb) p el
$1 = (class AbstractElement *) 0x11cf600
)时,我得到以下内容:
getType
基本上,我认为即使我的指针检查工作并且地址与创建此对象的时间相同仍然相同,我也无法调用此对象的任何函数。
第一个问题:这与从不同线程调用有什么关系 - 我使用Qt作为我的UI而不是100%确定Qt是否可以创建自己的线程?
第二个问题:这实际上是否意味着问题可能出现在我的代码中的任何地方,这只是一个混乱的函数表作为结果?