话说...起因是这样的...
本人将一个VC6项目迁移到VS2010下编译运行后, VS2010报了一个Debug Assertion Failed的错误.
调试后发现是当时在VC6中对一个vector逐个元素赋值时, 下标越界多加了个一.
但这个VC6项目编译出来的东西平时一直也没见运行时有啥不正常, 就写了段测试代码对比了一下.
测试代码:
1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 vector<int> vecTest; 4 vecTest.resize(10); 5 vecTest[10] = 10086; 6 7 system("pause"); 8 9 return 0; 10 }
上面的代码明显犯了个越界错误, 但是, VC6的表现跟VS却是不一样的:
VC6可以运行到控制台显示"按任意键继续", 接着按任意键程序退出时,才报错;
而VS2010在运行到vecTest[10]这一句时就及时的报了DAF错误..
于是从调用栈跟进去看到底发生了什么..
VS2010中下标的实现:
1 reference operator[](size_type _Pos) 2 { // subscript mutable sequence 3 #if _ITERATOR_DEBUG_LEVEL == 2 4 if (size() <= _Pos) 5 { // report error 6 _DEBUG_ERROR("vector subscript out of range"); 7 _SCL_SECURE_OUT_OF_RANGE; 8 } 9 10 #elif _ITERATOR_DEBUG_LEVEL == 1 11 _SCL_SECURE_VALIDATE_RANGE(_Pos < size()); 12 #endif /* _ITERATOR_DEBUG_LEVEL */ 13 14 return (*(this->_Myfirst + _Pos)); 15 }
VC6中下标的实现( 没错你没看错, 就只有这两行而已 ):
const_reference operator[](size_type _P) const {return (*(begin() + _P)); }
可以看到,VS2010的实现中, Debug模式下会对下标越界进行检测,
而VC6的标准库Debug时的检测十分宽松, 很多BUG都不会及时表现出来, 使用需谨慎.....