У меня есть следующий пример кода 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?
Это зависит от машины или от реализации?
И, самое главное, почему в одном случае "выход за рамки" возникает ошибка времени выполнения выдается, но в другом случае "за пределами" ошибка времени выполнения не выдается? Откуда эта ошибка? Массив или вектор? Спасибо за уделенное время
std::array
, чтобы помочь с проверкой границ. - person Paul Rooney   schedule 04.08.2016