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

C++程序调用RefreshFriend后终止问题的原理与修复求助

C++数组越界导致程序异常终止的原理与修复方案

问题原理

C++中数组的合法索引从0开始,负数索引属于完全非法的内存访问。当代码执行到neigh=0时,neigh-1等于-1,此时程序会尝试访问FrClose[0]数组起始地址往前偏移的内存区域——这部分内存要么不属于当前进程的地址空间,要么存储着操作系统或程序的关键数据。

操作系统的内存保护机制(比如页表校验)会立刻检测到这种非法访问,直接向进程发送终止信号,导致程序瞬间崩溃,后续的cout << "Cannot Continue Point ";这类代码自然没有机会执行。

修复方法

原代码的核心问题是索引计算错误导致越界,需根据实际业务逻辑调整:

方式1:从数组起始位置(索引0)开始填充

如果是想把d[0]到d[Circle-2]的元素对应存入FrClose[0][0]到FrClose[0][Circle-2],直接修正索引为neigh即可:

if(i == VehicleNodes.size()){
    for (int neigh = 0; neigh < (Circle - 1); neigh++){
        FrClose[0][neigh] = d[neigh].second;
        FrStays[0][neigh] = dS[neigh].second;
    }
}

方式2:跳过d[0],从d[1]开始填充到数组起始位置

如果逻辑是要把d[1]到d[Circle-1]的元素存入FrClose[0][0]到FrClose[0][Circle-2],则调整循环的起始值和终止条件:

if(i == VehicleNodes.size()){
    for (int neigh = 1; neigh < Circle; neigh++){
        FrClose[0][neigh-1] = d[neigh].second;
        FrStays[0][neigh-1] = dS[neigh].second;
    }
}

额外建议

为避免后续再出现类似问题,推荐用std::vector代替原生数组,它的at()方法会在索引越界时抛出std::out_of_range异常,而非直接崩溃,更便于调试定位问题。

内容的提问来源于stack exchange,提问作者Minh Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:12:50