stack overflow
堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到。我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过程的滋味还是相当酸爽,值得回味。
问题背景:
某项目中有个POI离线检索功能,比如搜索附近的加油站,底层引擎逻辑提供了一个C函数。
输入:经纬点,搜索范围半径,搜索类别。
输出:按照距离由近到远排好序的POI结果列表。
这是一个C函数,是同步接口,所以我在OC 上层做了一次封装,改成了异步调用,在子线程中执行。
问题现象:
(1)如果搜索加油站,酒店等匹配结果数据较少的类型,功能正常;
(2)如果搜索饭店,酒店这种匹配结果较多的类型时,则会导致程序Crash。Crash时线程堆栈显示crash在搜索子线程,Crash对应的代码行不固定,每次crash时都不一样,略诡异,但是都是Crash在对搜索结果进行快速排序的那个快排函数中;
(3)如果我减少搜索范围的半径,再搜索饭店或者酒店时,功能又正常了。
问题分析:
(1)只有检索结果列表中元素比较多的时候才出现问题,元素较少时功能正常;
(2)快速排序函数是非常标准的实现,而且大多数类别的搜索都是正常的,所以应该可以排除嫌疑。但是Crash线程调用堆栈却显示挂在了快速排序函数里面。说明函数的执行环境有问题;