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).

Antworten auf die Frage(5)

Ihre Antwort auf die Frage