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

例:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
       vector <int> a;
       a.push_back(66);
       a.push_back(88);
       
       cout << a[0] << endl;
       cout << a[1] << endl;
       cout << a[2] << endl; //发生越界。
       
       return 0;
}

输出:

VS2015下:

STL容器之vector 的下标越界是否报错

g++ 5.4.0下:

STL容器之vector 的下标越界是否报错

分析:

VS2015的vector实现:

STL容器之vector 的下标越界是否报错

g++ 5.4.0的vector实现:
STL容器之vector 的下标越界是否报错

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

STL容器之vector 的下标越界是否报错

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

补充:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
       vector <int> 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++都会报错,即都对数组越界做了检查,故推荐最好用这种方式。


相关文章:

  • 2022-12-23
  • 2022-01-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-27
猜你喜欢
  • 2021-07-20
  • 2022-01-16
  • 2021-06-27
  • 2021-09-04
  • 2021-11-15
  • 2022-12-23
相关资源
相似解决方案