0

最近我尝试使用 Qt 使我的代码跨平台。我在 Qt for Windows 和 Qt for Linux 下编译了相同的代码。但是,我的程序似乎在 Windows 下正常运行,但在 Linux 中(随机)崩溃。我很难弄清楚它为什么会在 Linux 上崩溃。也许了解 Windows 和 Linux 之间的区别是一个好的开始?或者,也许 Windows 有一些错误预防机制?

更新: 经过一些工作,我发现这是ceil()函数使程序崩溃的结果。

void setPedestriansByRealCo(int &_x,int &_y,myVector &v)
{
    int _row = 0,_colm = 0;
    boost::tuples::tie(_row,_colm) = mathOp::countRowAndColumn(_x,_y);
    setPedestriansByRowColumn(_row,_colm,v);
}

boost::tuples::tuple<int,int> countRowAndColumn(int realX,int realY)
{
    return boost::tuples::make_tuple(
                ceil((float)realY / gridWidth),
                ceil((float)realX / gridWidth)
                );
}

...

for(int i = 0; i < (int)_srcCurrentPointSet.size(); ++i) {
    int _areaRow,_areaColm;
    boost::tuples::tie(_areaRow,_areaColm) = judgePointArea(
                       _srcCurrentPointSet[i],
                       boost::tuples::make_tuple(32,24)); //use the result of countROwAndColumn
    areaPointsCurr[_areaRow * singleAreaColm + _areaColm].push_back(_srcCurrentPointSet[i]);   //<---SIGSEGV
}

如果输入的countRowAndColumn是(181,715),那么输入的输出就是_srcCurrentPointSet<18,72>,这会在Linux的for循环中引起SIGSEGV(字段为128*72)。

4

0 回答 0