我正在使用 Visual Studio 2008。
我知道 std::vector 使用 at() 函数进行边界检查,并且如果您尝试使用运算符 [] 错误地访问某些内容(超出范围),则会出现未定义的行为。
我很好奇是否可以通过边界检查来编译我的程序。这样,operator[] 将使用 at() 函数并在任何超出范围时抛出 std::out_of_range 。
发布模式将在没有对 operator[] 的边界检查的情况下进行编译,因此性能不会降低。
我开始考虑这个问题是因为我正在将使用 Borland C++ 编写的应用程序迁移到 Visual Studio,并且在一小部分代码中我有这个(i=0,j=1):
v[i][j]; //v is a std::vector<std::vector<int> >
向量 'v' 的大小是 [0][1] (所以向量的元素 0 只有一个元素)。这是未定义的行为,我知道,但 Borland 在这里返回 0,VS 正在崩溃。我更喜欢崩溃而不是返回 0,所以如果我可以通过抛出 std::out_of_range 异常来获得更多的“崩溃”,迁移将更快地完成(因此它会暴露 Borland 隐藏的更多错误)。