最近我尝试使用 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)。