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

来源:互联网 发布:小甲鱼windows教程 编辑:程序博客网 时间:2024/06/03 13:42

          最初我在运行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<Point2f*>(&(landmarks.at(obs.z)));

运行就成功了。

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

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

       

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


0 0