QT调试时提示Signal name: SIGSEGV - Signal meaning: Segmentation Fault

          最初我在运行QT时,点击某个功能的按钮时,界面一下就消失了。我找到这个按钮相关的函数,设置断点,分步调试:

在下面这个程序处显示:Signal name: SIGSEGV - Signal meaning: Segmentation Fault。

            谷歌查找之后说是This usually happens when accessing a pointer that was not initialized or was set to 0.

void ProRobotics::MeasurementModel(Mat &delta_z, Point3f obs, Point3f xPred, Mat *Ht, Point2f *estLm)
{//delta_z用来存储对landmarks的真是观测和预测的差值向量
    float   dst,theta;                              //用来存储范数,就是两点之间的距离
    Point2f z, zp;                                  //用来存储真实观测值(与后者差值)和预测的观测值
    Point2f delta;                                  //用来存储landmarks与预测的机器人位姿的差值向量]
    if(!estLm)//如果Landmark的估计值是空,则调用者非SLAM
    {//将estLm指定为Landmark的真实值
        estLm = landmarks.at(obs.z);
    }
......

        调试到if语句时出现错误了,修改为:estLm = reinterpret_cast(&(landmarks.at(obs.z)));

运行就成功了。

        出现这个原因的地方会很多,但是原因都差不多是访问不存在或者不正确的地方造成的。

下面这个程序是我再一次遇到这种错误的程序。当这里的double是float时有时候也会出现这种错误。

       

  //计算Vt(3*2)   at时会出现segfault的错误。
        Vt.at(0,0)=(sin(xLast.z+Wd*T)-sin(xLast.z))/Wd; Vt.at(0,1)=Vd*(sin(xLast.z)-sin(xLast.z+Wd*T))/Wd/Wd+Vd*cos(xLast.z+Wd*T)*T/Wd;
        Vt.at(1,0)=(cos(xLast.z)-cos(xLast.z+Wd*T))/Wd;  Vt.at(1,1)=-Vd*(cos(xLast.z)-cos(xLast.z+Wd*T))/Wd/Wd+Vd*sin(xLast.z+Wd*T)*T/Wd;
        Vt.at(2,0)=0;                          	        Vt.at(2,1)=T;


你可能感兴趣的:(QT,C++)