慎用VC6中的STL....

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

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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值