关于C++语言中数组越界的问题

各位大侠:
C++语言中数组越界属于异常吗,用普通的异常处理能否捕捉?
如果普通的异常处理没有效果,应该采用什么手段处理越界问题?
小弟被这些问题困扰许久!

这种应该不算是异常,是程序的bug,用C++的异常处理也比较难捕捉,越界读写都可能导致错误的结果,甚至导致程序崩溃,要处理这种情况只能靠平时写代码时多积累,在有可能发生越界的地方做相应的判断处理。另外,可以用一些静态代码检查工具来帮助发现问题,但是并不能保证所有问题都能发现,关键还是要靠程序员的经验,所以说一般公司招程序员都需要有经验的。比较好的工具有pc-lint,比如我下面这个例子:

我上面的代码发生了写越界,但是运行时,并不能捕获异常。使用pc-lint检查工具来检查,可以发现这两个地方的越界写都可以检查出来。双击下面的提示就能转换到有问题的代码。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-04
[]操作符不会抛出异常,所以完全没办法捕捉
可以用vector的at()方法,这个函数能抛出out_of_range异常。
第2个回答  2014-12-04
不算是异常
算是代码的bug
一般来说 靠好的书写习惯主观上进行避免
比如在使用下标前进行一些异常的判断
if(index < len)
... // 执行函数体
else
... // 进行一些log或者异常抛出
当然 如果每次都这样判断相对是比较冗余的
一般只有在这个index是计算或是外部传进来时 才需要判断
这个只要代码写多了 自己控制好 一般就不会有问题了
第3个回答  2015-10-29
  二维数组定义的一般形式为:类型说明符 数组名 [常量表达式][常量表达式]
这两个常量表达式分别指定了二维数组的行数和列数,程序编译时据此向内存申请空间。
而引用二维数组的格式为: 数组名[行下标][列下标],行下标和列下标都是从0开始排序。这里的下标和上面的常量表达式意义不同,范围也不同。
  例如:
  int b[4][5]是定义一个名为b的二维数组,它包含4行5列,共20个元素。如果存放数组b的首地址为p,则内存为数组分配的空间是p~p+19;数组b的行下标范围为0~3,列下标范围为0~4,地址p+19存放的元素为b[3][4]。如果要引用b[4][5],由于没有提前向内存申请地址,则会随机指向一个地址,得到一个垃圾数据,无法实现我们的目的,就说是引用下标越界。
相似回答