Почему при доступе к последнему элементу в С++ нет ошибки времени выполнения?

У меня есть следующий пример кода 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 вызовет ошибку времени выполнения. Но очевидно, что это не так.

Я использую g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 на виртуальной машине Ubuntu.

Может ли кто-нибудь объяснить мне, почему не возникает ошибка времени выполнения?
Это поведение undefined?
Это зависит от машины или от реализации?
И, самое главное, почему в одном случае "выход за рамки" возникает ошибка времени выполнения выдается, но в другом случае "за пределами" ошибка времени выполнения не выдается? Откуда эта ошибка? Массив или вектор? Спасибо за уделенное время


person Ely    schedule 04.08.2016    source источник
comment
есть так много дубликатов этого   -  person phuclv    schedule 04.08.2016
comment
посмотрите на std::array, чтобы помочь с проверкой границ.   -  person Paul Rooney    schedule 04.08.2016
comment
Спасибо вам, ребята. Но оба комментария не помогают мне, если честно. Я показал два случая, которые выходят за рамки. В одном случае есть ошибка времени выполнения, а в другом, что удивительно, ошибки времени выполнения нет. Вы не находите это запутанным и непоследовательным? Я не думаю, что это дубликат. Кроме того, я имею в виду C++, а не C (у которого есть собственная спецификация); обратите внимание, что я использую Vector в примере.   -  person Ely    schedule 04.08.2016
comment
@Elyasin, как указано во многих ответах, компилятору не нужно проверять на UB, и он не обязан генерировать какой-либо код, чтобы ваша программа не работала в UB. Значит у вас UB в обоих случаях, в одном может вылететь в другом может и нет. Никто не может гарантировать, что UB имеет последовательное поведение.   -  person Slava    schedule 04.08.2016


Ответы (1)


C/C++ не выполняет никакой проверки диапазона. Это потому, что есть штраф за производительность. Таким образом, доступ к массиву за пределами его диапазона является поведением undefined. Все может случиться, включая повреждение данных. Считайте, что вам повезло, программа дала сбой.

person doron    schedule 04.08.2016