索引在Windows上超出限制但在Mac上没有

时间:2017-06-13 16:06:29

标签: windows macos qt c++11

在我的程序中]错误地写了一些内容:

std::vector<std::string> foo;
std::string test = "hello";
for (int i = 0; i < 10; i++){
    foo.puch_back(test);
}

qDebug() << QString::FromStdString(foo[10]);

这显然不会起作用,因为索引10大于向量的大小。

当我在Mac上运行此代码时,我得到"",而在Windows上运行时,我收到错误:

  

索引越界

我想知道为什么在Windows上崩溃(就像我预期的那样)在Mac上它&#34;工作&#34;

3 个答案:

答案 0 :(得分:1)

当访问您不应访问的内存时,它可以采用两种方式,具体取决于您的程序是否拥有该部分内存:

  1. 该部分内存不属于您的进程:操作系统会注意到这种不当行为并终止您的程序。 (着名的分段错误
  2. 内存 的那部分属于您的进程:在这种情况下,您将静默读取或覆盖您自己的数据!
  3. 这些中的哪一个可能完全是随机的。这取决于编译器,并且每次运行也会有所不同,这使得调试变得非常麻烦!

    作为程序员,你面临的第一个问题是第二种情况。这个问题很容易被忽视,但影响可怕。您访问的地址可能包含属于另一个变量的数据。

    现在,如果这只是一个字符或数字,您可能会注意到字符串/向量末尾的不寻常的,看似随机的字符/数字 - 但现在想象一个对象的对象,例如vector<SomeClass> foo 您可能永远不会费心直视foo的内容,因为它不包含很好的人类可读信息。

    正如vivi已经暗示的那样,解决方案是通过.at()访问元素,因为当你尝试在数组的边界之外读/写时它总会产生异常,所以你的错误不会发生没有注意到,你可以马上解决它。

答案 1 :(得分:0)

类似的讨论:Vector going out of bounds without giving error

答案提到:

  

STL向量在.at()成员函数执行时执行边界检查   调用,但不对[]运算符执行任何检查。

     

当超出范围时,[]运算符会产生未定义的结果。

答案 2 :(得分:0)

请查看以下文档:

http://en.cppreference.com/w/cpp/container/vector/operator_at

使用operator []时无法执行边界检查。

所以行为是未定义的,取决于处理情况的编译器。

但请查看下面的文档

http://en.cppreference.com/w/cpp/container/vector/at

std::vector::at这将进行边界检查。

如果您尝试使用&#34;在&#34;,您将在两者上看到相同的结果。