最近做的一个C++程序, 使用了以vector为元素的定长数组。
因为出错代码是接收gps数据后进行处理时出错的,出错的环境在客户那边,只能间接调试。
使用挂异常处理函数的方法,dmp出错的地方。windbg的出错提示是:
FOLLOWUP_IP:
CrossBorderJudge!std::vector<MeshRoute * __ptr64,std::allocator<MeshRoute * __ptr64> >::size+10 [c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector @ 879]
00000001`3ffe6040 488b4908 mov rcx,qword ptr [rcx+8]
MOD_LIST: <ANALYSIS/>
FAULTING_THREAD: 0000000000000a18
BUGCHECK_STR: APPLICATION_FAULT_INVALID_POINTER_READ_WRONG_SYMBOLS
PRIMARY_PROBLEM_CLASS: INVALID_POINTER_READ
DEFAULT_BUCKET_ID: INVALID_POINTER_READ
FAULTING_SOURCE_CODE:
875: }
876:
877: size_type size() const
878: { // return length of sequence
> 879: return (this->_Mylast - this->_Myfirst); // 这里错误
880: }
881:
882: size_type max_size() const
883: { // return maximum possible length of sequence
884: return (this->_Alval.max_size());
网上找了很多文章,大多说这里是多线程访问导致的问题,我分析自己的代码就是两个线程,不可能同时访问这里。
后来我想 可能是接收的gps数据导致访问数组越界,果然,写了点模拟代码,就是在size函数里面,首尾指针都是无效搞出的问题。
最后,添加边界判断的代码,搞定。