std :: set :: insert()分段故障



我通过插入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::vectorstd::array(C 11及以上)的第一步:

std::vector<std::set<Inbox*>> receivers;
std::array<std::set<Inbox*>, 256> receivers;

当您调整代码以匹配该更改时,我几乎期望您的问题来源揭示自己...

作为一般规则,如果可能的话,请勿在C 中使用C风格数组。

相关内容

  • 没有找到相关文章

最新更新