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
阅读全文
0 0
- vector resize失败导致下标越界
- 关于 std::vector 的下标越界检查
- 下标越界
- DSP28335数组下标越界导致其他全局变量被窜改
- vector.resize
- vector::resize
- vector--resize
- vector::resize()
- vector--resize()
- List下标越界
- 关于数组下标越界
- 数组下标越界错误
- 数组下标越界
- 数组下标越界异常
- C++ vector的访问(resize,pu_back与下标访问的区别)
- 通过下标遍历std::vector,一个非常隐蔽的越界错误
- vector::reserve && vector::resize
- 关于下标越界的问题
- Docker 使用Tomcat
- 在SQL Server中对视图进行增删改
- 陌生人与富翁
- linux下执行http请求
- SQLYog实用快捷键
- vector resize失败导致下标越界
- nodejs路径问题
- 前端小白路--JS中的全局变量和局部变量
- theano学习指南及tensorflow官方文档中文版
- 腾讯面试官送给准程序员的一些建议![转](收藏)
- 软件测试简历,这一点你是否漏掉
- 【Maven实战】之生命周期
- 《我还是很喜欢你》
- 判断素数