You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:06:00