查找数组中两个非重复数字的代码未触发Java式数组越界错误咨询
为什么C++的vector越界访问不会抛出类似Java的ArrayIndexOutOfBounds错误
根本原因
- C++标准库的
std::vector设计遵循零开销原则,[]下标运算符默认不会做边界检查,越界访问属于未定义行为,不会主动抛出异常。 - 越界后的运行结果完全由内存状态决定:如果访问的地址恰好是程序合法可访问的内存区域,程序会继续运行,只是可能读到脏数据;如果访问到不可访问的内存页,才会触发段错误导致程序终止。
- 如果需要主动做边界检查,可以使用
std::vector的at()方法访问元素,该方法会在越界时抛出std::out_of_range异常,和Java的数组越界异常行为一致。
你提供的代码存在明确越界风险
当循环变量i等于nums.size()-1时,循环判断条件i < nums.size()仍然成立,此时访问nums[i+1]等价于访问nums[nums.size()],属于标准的越界访问,只是C++不会主动抛出异常而已,该逻辑漏洞需要修复,你可以补充边界判断:
for(int i = 0; i < nums.size(); i++) { if(i + 1 < nums.size() && nums[i] == nums[i+1]) i++; else ret.push_back(nums[i]); }
内容的提问来源于stack exchange,提问作者Anil Joshi
相关产品推荐
相关产品推荐

