哇擦,传说中的堆栈溢出和快速排序

本文介绍了在iOS开发中遇到的堆栈溢出和快速排序导致程序崩溃的问题。问题出现在搜索结果较多时,由于子线程默认堆栈大小较小,快速排序递归导致堆栈溢出。解决方案包括增大子线程堆栈大小和优化快速排序算法。文章总结了预防堆栈溢出的方法,并分享了快速排序的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

stack overflow

堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到。我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过程的滋味还是相当酸爽,值得回味。

问题背景:

某项目中有个POI离线检索功能,比如搜索附近的加油站,底层引擎逻辑提供了一个C函数。

输入:经纬点,搜索范围半径,搜索类别。

输出:按照距离由近到远排好序的POI结果列表。

这是一个C函数,是同步接口,所以我在OC 上层做了一次封装,改成了异步调用,在子线程中执行。

问题现象:

(1)如果搜索加油站,酒店等匹配结果数据较少的类型,功能正常;

(2)如果搜索饭店,酒店这种匹配结果较多的类型时,则会导致程序Crash。Crash时线程堆栈显示crash在搜索子线程,Crash对应的代码行不固定,每次crash时都不一样,略诡异,但是都是Crash在对搜索结果进行快速排序的那个快排函数中;

(3)如果我减少搜索范围的半径,再搜索饭店或者酒店时,功能又正常了。

问题分析:

(1)只有检索结果列表中元素比较多的时候才出现问题,元素较少时功能正常;

(2)快速排序函数是非常标准的实现,而且大多数类别的搜索都是正常的,所以应该可以排除嫌疑。但是Crash线程调用堆栈却显示挂在了快速排序函数里面。说明函数的执行环境有问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值