慎用VC6中的STL....

话说...起因是这样的...

本人将一个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都不会及时表现出来, 使用需谨慎.....

上一篇:mongodb4.0 安装


下一篇:VS2010版快捷键