Я использую Visual Studio 2008.
Я знаю, что std::vector имеет проверку границ с помощью функции at() и имеет поведение undefined, если вы пытаетесь получить доступ к чему-либо с помощью оператора [] неправильно (вне диапазона).
Мне интересно, возможно ли скомпилировать мою программу с проверкой границ. Таким образом, оператор [] будет использовать функцию at() и бросать std:: out_of_range всякий раз, когда что-то выходит за пределы.
Режим освобождения будет скомпилирован без проверки границ для оператора [], поэтому производительность не ухудшается.
Я подумал об этом, потому что я переношу приложение, написанное с использованием Borland С++ для Visual Studio, и в небольшой части кода у меня есть это (с я = 0, j = 1):
v[i][j]; //v is a std::vector<std::vector<int> >
Размер вектора 'v' равен [0] [1] (поэтому элемент 0 вектора имеет только один элемент). Это поведение undefined, я знаю, но Borland возвращается 0 здесь, VS сбой. Мне нравится крах лучше, чем возврат 0, поэтому, если я могу получить больше "сбоев" из создаваемого исключения std:: out_of_range, миграция будет завершена быстрее (так что это приведет к появлению большего количества ошибок, которые скрывал Borland).