我来自Java并且正在学习C++.我正在使用Stroustrup的Progamming原则和使用C++的实践.我现在正在使用矢量.在页117,他说,访问向量的不存在元素将导致运行时错误(在Java中相同,索引超出范围).我正在使用MinGW编译器,当我编译并运行此代码时:
#include <iostream>
#include <cstdio>
#include <vector>
int main()
{
std::vector<int> v(6);
v[8] = 10;
std::cout << v[8];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给了我作为输出10.更有趣的是,如果我不修改不存在的向量元素(我只打印它期望运行时错误或至少是默认值)它会打印一些大整数.那么...... Stroustrup是错误的,还是GCC有一些编译C++的奇怪方法?
在clang中,有没有办法启用边界检查[]访问std :: vectors和其他STL容器,最好只在调试模式下构建?
我花了好几个小时寻找一个微妙的错误,结果是我们访问了std :: vector的末尾.当它检测到错误时,它不需要做任何聪明的事情,只需在调试器中陷阱,以便我可以找到它发生的位置并在代码中修复它.
除了"创建继承自std :: vector的自己的类型"之外,有没有办法做到这一点,我想避免哪些?
(如果这有所不同,我正在使用clang 3.1版.)