为什么在访问C ++中的past-the-end元素时没有运行时错误?

时间:2016-08-04 06:17:16

标签: c++ arrays vector runtime-error

我有以下C ++示例代码,我的想法是它在LINE II处抛出运行时错误。

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void printer(int i) {
        cout << i << ", ";
}
int main() {
        int mynumbers1[]={3, 9, 0, 2};
        int mynumbers2[]={6, 1, 4, 5};
        vector<int> v1(7);
        sort(mynumbers2, mynumbers2 + 4);
        sort(mynumbers1, mynumbers1 + 4);//LINE I
        merge(mynumbers1, mynumbers1+5, mynumbers2, mynumbers2+5, v1.begin());//LINE II
        for_each(v1.begin(), v1.end(), printer);
        return 0;
}

但是,该程序的输出实际上是:

0, 1, 2, 3, 4, 5, 6, 

如果我将合并的第二个参数更改为mynumbers1+6,那么我会收到运行时错误:

*** Error in `./program': free(): invalid next size (fast): 0x0000000002468010 ***
0, 1, 2, 3, 4, 5, 6, Aborted (core dumped)

我很惊讶,因为过去的结尾元素是mynumbers1+4因此我期望mynumbers1+5抛出运行时错误。但显然事实并非如此。

我在Ubuntu虚拟机上使用g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

有人可以向我解释为什么没有抛出运行时错误?
是不确定的行为?
它是机器还是实现依赖?
而且,最重要的是,为什么在一个&#34;越界&#34;如果抛出运行时错误,但在另一个&#34;越界&#34;情况下没有抛出运行时错误?这个错误来自哪里?数组还是向量? 谢谢你的时间

1 个答案:

答案 0 :(得分:5)

C / C ++不执行任何范围检查。这是因为存在性能损失。因此,访问超出其范围的数组是未定义的行为。任何事情都可能发生,包括数据腐败。认为自己很幸运,程序崩溃了。