C++实现[3,n]区间素数筛法n≥200堆内存损坏如何解决
问题修复方案
错误根源
- 你申请的
bool类型动态数组nums长度为k,C++中数组合法下标范围是0到k-1,不存在下标为k的元素 - 筛选循环的判断条件写为
i + j + 2 * i * j <= k,当表达式结果等于k时,程序会向nums[k]写入数据,直接访问了堆缓冲区的越界内存,触发堆破坏报错。n较小时越界访问的内存未被系统关键检测逻辑占用,因此没有触发报错,n≥200时刚好触发了堆溢出检测。
修复方法
只需要修改while循环的判断条件,将<=k改为<k即可,修改后的筛选循环代码如下:
for (int i = 1; i < k; i++) { int j = i; // 调整边界判断,避免下标越界 while (i + j + 2 * i * j < k) { nums[i + j + 2 * i * j] = false; j++; } }
可选优化建议
- 改用C++标准库的
vector<bool>代替手动申请的动态数组,自动管理内存,不需要手动delete,降低内存泄漏风险 - 增加输入合法性校验,判断
n≥3后再执行筛选逻辑,避免n小于3时出现无意义的输出或者逻辑错误
内容的提问来源于stack exchange,提问作者Rodion Iskhakov
相关产品推荐
相关产品推荐

