在我的程序中]错误地写了一些内容:
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;
答案 0 :(得分:1)
当访问您不应访问的内存时,它可以采用两种方式,具体取决于您的程序是否拥有该部分内存:
这些中的哪一个可能完全是随机的。这取决于编译器,并且每次运行也会有所不同,这使得调试变得非常麻烦!
作为程序员,你面临的第一个问题是第二种情况。这个问题很容易被忽视,但影响可怕。您访问的地址可能包含属于另一个变量的数据。
现在,如果这只是一个字符或数字,您可能会注意到字符串/向量末尾的不寻常的,看似随机的字符/数字 - 但现在想象一个对象的对象,例如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;,您将在两者上看到相同的结果。