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
相关产品推荐
相关产品推荐

