2016-08-04 4 views
2

Ich habe den folgenden C++ - Beispielcode und mein Denken war, dass es einen Laufzeitfehler bei LINE II wirft.Warum gibt es keinen Laufzeitfehler beim Zugriff auf das Element "Past-the-End" in C++?

#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; 
} 

jedoch die Ausgabe des Programms ist es tatsächlich:

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

Wenn ich ändern, zum Beispiel, der zweite Parameter der Zusammenführung mynumbers1+6 dann bekomme ich einen Laufzeitfehler:

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

Ich bin überrascht, weil das Vergangenheit-am-Ende-Element ist mynumbers1+4 und so erwartete ich mynumbers1+5, um einen Laufzeitfehler zu werfen. Aber offensichtlich ist das nicht der Fall.

Ich verwende g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 auf einer virtuellen Ubuntu-Maschine.

Kann mir jemand erklären, warum kein Laufzeitfehler ausgelöst wird?
Ist es undefiniertes Verhalten?
Ist es abhängig von der Maschine oder der Implementierung?
Und vor allem, warum in einem "out of bounds" -Fall ein Laufzeitfehler ausgelöst wird, aber in dem anderen "out of bounds" -Fall kein Laufzeitfehler ausgelöst wird? Woher kommt dieser Fehler? Das Array oder der Vektor? Vielen Dank für Ihre Zeit

+1

Es gibt so viele Duplikate dieses –

+0

Blick auf 'std :: array', um mit Grenzen zu helfen, zu überprüfen. –

+0

Danke Jungs. Aber beide Kommentare helfen mir nicht, ehrlich zu sein. Ich habe zwei Fälle gezeigt, die "out of bound" sind. In einem Fall gibt es einen Laufzeitfehler und in dem anderen Fall gibt es überraschenderweise keinen Laufzeitfehler. Finden Sie das nicht verwirrend und inkonsistent? Ich glaube nicht, dass es ein Duplikat ist. Nebenbei, ich beziehe mich auf C++ und nicht auf C (welches eine eigene Spezifikation hat); Beachten Sie, dass ich Vector in dem Beispiel verwende. – Elyasin

Antwort

5

C/C++ führt keine Bereichsüberprüfung durch. Dies liegt daran, dass eine Leistungseinbuße vorliegt. Ein Zugriff auf ein Array außerhalb seines Bereichs ist daher ein nicht definiertes Verhalten. Alles kann passieren, einschließlich Daten corruprion. Betrachten Sie sich glücklich, das Programm ist abgestürzt.

Verwandte Themen