2020-11-03

STL容器之vector 的下标越界是否报错
今天将程序在VS2015和g++ 5.4.0下运行,发现vector越界 VS会报错,而g++正常输出。故而查看了源码,看个究竟。

例:

#include
#include
using namespace std;
int main()
{
vector a;
a.push_back(66);
a.push_back(88);

   cout << a[0] << endl;
   cout << a[1] << endl;
   cout << a[2] << endl; //发生越界。
   
   return 0;

}
输出:

VS2015下:

g++ 5.4.0下:

分析:

VS2015的vector实现:

g++ 5.4.0的vector实现:

我还查看了侯捷老师的<<STL源码剖析>>的早期SGI STL实现:

可见:P.J.Plauger版本(VS用的是PJ版本的STL)STL对STL下标有越界检查,而SGI STL的vector没有对下标做检查。

补充:

#include
#include
using namespace std;
int main()
{
vector a;
a.push_back(66);
a.push_back(88);

   cout << a[0] << endl;
   cout << a[1] << endl;      
   cout << *(a.begin() + 2) << endl; //发生越界,VS报错,g++正常输出。
   cout << a.at(2) << endl; //发生越界,VS和g++都会报错。
         
   return 0;

}
同理,*(a.begin() + 2) 也是VS STL做了越界检查而g++ STL没有检查。但a.at(2)无论是VS还是g++都会报错,即都对数组越界做了检查,故推荐最好用这种方式。

转载自:https://www.cnblogs.com/a3192048/p/12241331.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值