Wie man den Operator [] von std :: vector dazu bringt, Grenzen in DEBUG, aber nicht in RELEASE zu überprüfen
Ich verwende Visual Studio 2008.
Mir ist bekannt, dass std :: vector mit der Funktion at () eine Grenzwertprüfung durchführt und ein undefiniertes Verhalten aufweist, wenn Sie versuchen, mit dem Operator [] falsch auf etwas zuzugreifen (außerhalb des gültigen Bereichs).
Ich bin gespannt, ob es möglich ist, mein Programm mit der Schrankenprüfung zu kompilieren. Auf diese Weise würde der Operator [] die at () -Funktion verwenden und ein std :: out_of_range werfen, wenn etwas außerhalb der Grenzen liegt.
Der Freigabemodus wird ohne Einschränkung für operator [] kompiliert, sodass die Leistung nicht beeinträchtigt wird.
Ich habe darüber nachgedacht, weil ich eine App, die mit Borland C ++ geschrieben wurde, nach Visual Studio migriere und in einem kleinen Teil des Codes Folgendes habe (mit i = 0, j = 1):
v[i][j]; //v is a std::vector<std::vector<int> >
Die Größe des Vektors 'v' ist [0] [1] (Element 0 des Vektors hat also nur ein Element). Dies ist undefiniertes Verhalten, ich weiß, aber Borland gibt hier 0 zurück, VS stürzt ab. Der Absturz gefällt mir besser als die Rückgabe von 0. Wenn ich also durch die Ausnahmebedingung std :: out_of_range mehr Abstürze bekomme, wird die Migration schneller abgeschlossen (wodurch mehr Fehler aufgedeckt werden, die Borland versteckt hat).