vector resize失败导致下标越界

来源:互联网 发布:软件设计师考试济宁 编辑:程序博客网 时间:2024/06/15 20:07

今天接到别的组报过来的dump,分析看到堆栈如下



找到对应代码如下


红框为dump对应代码,第一反应是数组越界,

但是一看vecList.resize设置的size=dwCount,

这里dwIndex怎么也不可能越界啊。


没办法,注意到函数_invalid_parameter_noinfo

先查查是怎么调用到它的,正常代码没有调这个,那就很可能是STL库中调用的,

查看vector源码,对应的[]操作符重载如下


Release版是会调用

_SCL_SECURE_VALIDATE_RANGE(_Pos < size());

看起来像是数组越界做检查

直接跟踪看下去:

#define _SCL_SECURE_VALIDATE_RANGE(cond)\{\if (!(cond))\{\_ASSERTE((#cond, 0));\_SCL_SECURE_OUT_OF_RANGE_NO_ASSERT;\}\__analysis_assume(cond);\}    #define _SCL_SECURE_OUT_OF_RANGE_NO_ASSERT_SCL_SECURE_INVALID_PARAMETER("out of range") #ifndef _SCL_SECURE_INVALID_PARAMETER#define _SCL_SECURE_INVALID_PARAMETER(expr) ::_invalid_parameter_noinfo()#endif

真还是数组下标越界时调用的,那么为什么会越界呢?查看vector源码发现resize会分配内存,这里很可能失败,尤其是这里加载列表数据,在内存不足时很可能扩容失败。

后台查看这个dump对应的用户id,发现都是同一个用户,基本可以定位是机器内存问题了。


为了解决这个问题,resize改成如下

vecList.reserve( dwCount );vecList.resize( dwCount );dwCount = vecList.size();

这样可以方便的扩容,且兼容可能失败的场景。


原创,转载请注明来自http://blog.csdn.net/wenzhou1219

原创粉丝点击