我通过插入std :: set。
使用GCC编译时,它可以正常工作,但是使用QTCreator(应用程序的另一部分都需要),它会在STD内部进行分割故障。
班级的标题:
class Transceiver{
...
std::set<Inbox*> receivers [256];
};
初始化:
Transceiver::Transceiver(...)
{
...
for(int i = 0 ; i < 256 ; i++)
{
receivers[i] = std::set<Inbox*>();
receivers[i].clear();
}
...
}
这里使用:
void Transceiver::addreceiver(Inbox& i , uint8_t id)
{
receivers[id].insert(&i);
}
GDB回溯:(从#4开始)
Thread 1 "ControllGUI" received signal SIGSEGV, Segmentation fault.
0x0005e2b4 in std::less<Inbox*>::operator() (this=0x660c0, __x=@0x7effe154: 0x433550, __y=<error reading variable>)
at /usr/include/c++/6/bits/stl_function.h:386
386 { return __x < __y; }
(gdb) bt
#0 0x0005e2b4 in std::less<Inbox*>::operator() (this=0x660c0, __x=@0x7effe154: 0x433550, __y=<error reading variable>)
at /usr/include/c++/6/bits/stl_function.h:386
#1 0x0005e3cc in std::_Rb_tree<Inbox*, Inbox*, std::_Identity<Inbox*>, std::less<Inbox*>, std::allocator<Inbox*> >::_M_get_insert_unique_pos
(this=0x660c0, __k=@0x7effe154: 0x433550) at /usr/include/c++/6/bits/stl_tree.h:1836
#2 0x0005cd5c in std::_Rb_tree<Inbox*, Inbox*, std::_Identity<Inbox*>, std::less<Inbox*>, std::allocator<Inbox*> >::_M_insert_unique<Inbox*>(Inbox*&&) (this=0x660c0,
__v=<unknown type in /home/pi/DT_WS1718_02_StarCar/pi/GUI/build-ControllGUI-Desktop-Debug/ControllGUI, CU 0x284fbc, DIE 0x29c590>)
at /usr/include/c++/6/bits/stl_tree.h:1889
#3 0x0005bab0 in std::set<Inbox*, std::less<Inbox*>, std::allocator<Inbox*> >::insert(Inbox*&&) (this=0x660c0,
__x=<unknown type in /home/pi/DT_WS1718_02_StarCar/pi/GUI/build-ControllGUI-Desktop-Debug/ControllGUI, CU 0x284fbc, DIE 0x29af30>)
at /usr/include/c++/6/bits/stl_set.h:492
#4 0x00059f5c in Transceiver::addreceiver (this=0x64f94, i=..., id=180 '264') at ../../IBP/IBC_Transceiver.cpp:160
#5 0x00028788 in Inbox::listen (this=0x433550, id=180 '264') at ../../IBP/IBC_Inbox.cpp:98
#6 0x000253b0 in SensorValuesWidget::SensorValuesWidget (this=0x484000, parent=0x7effee1c, alertThread=0x2411c0, pButtonGoBackText=...,
IBCPointer=0x64d94 <__libc_csu_init+76>) at ../ControllGUI/sensorvalueswidget.cpp:16
#7 0x0001b4bc in HomeWindow::showSensorValuesWidgetAfterControlMode (this=0x7effee1c) at ../ControllGUI/homewindow.cpp:132
#8 0x00061b64 in HomeWindow::qt_static_metacall (_o=0x7effee1c, _c=QMetaObject::InvokeMetaMethod, _id=8, _a=0x7effe288)
at moc_homewindow.cpp:107
#9 0x76470524 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib/arm-linux-gnueabihf/libQt5Core.so.5
#10 0x0006470c in ControllerControlModeWidget::showsensorvalueswidget (this=0x40b728) at moc_controllercontrolmodewidget.cpp:170
#11 0x00024d0c in ControllerControlModeWidget::slotShowSensorValues (this=0x40b728) at ../ControllGUI/controllercontrolmodewidget.cpp:169
#12 0x00064348 in ControllerControlModeWidget::qt_static_metacall (_o=0x40b728, _c=QMetaObject::InvokeMetaMethod, _id=6, _a=0x7effe3f4)
at moc_controllercontrolmodewidget.cpp:101
在segfault显示之前的qtcreator调试器__y __y
之前可能是什么问题?呼叫之前的集合是空的,但我仍然看到STD调用了一个比较。另外(阅读有关此问题的其他问题)指针默认情况下是可比的。
编辑:找到答案中描述的问题的来源。
最终是一名同事 - 用户创建一个收发器对象,但将错误的指针传递给代码,该指针使用它,导致不确定的行为。就像GDB输出显示的那样,它导致它在我提供的内部代码中失败,所以它在我的头上。
因此,有一些要记住的要点:
- 以不确定的行为,甚至误差的位置不确定
- 相信您的测试
std::set<Inbox*> receivers [256]
您在这里做的是创建256组收件箱指针的数组。如果这确实是您的意图,那么我建议您将其坚持使用C 并使用std::vector
或std::array
(C 11及以上)的第一步:
std::vector<std::set<Inbox*>> receivers;
std::array<std::set<Inbox*>, 256> receivers;
当您调整代码以匹配该更改时,我几乎期望您的问题来源揭示自己...
作为一般规则,如果可能的话,请勿在C 中使用C风格数组。