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