最近我尝试了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
中的输出将为&lt; 18,72&gt;,这将导致Linux中for循环中的SIGSEGV(字段为128 * 72)。