Вот к примеру
char ch = str[5];
длина str всего 3. Поэтому возникает ошибка, но vs не вылетает
Оно и не должно вылетать. Выход за пределы массива это
неопределённое поведение. Компилятор вправе делать что угодно при неопределённом поведении, хоть систему вам форматировать, хоть пойти закурить. Он не обязан выкидывать исключение. Контроль этого только на вашей ответственности. Либо используйте статический анализатор, он вам покажет, что вы не так делаете.
А ещё лучше, для строк используйте специально созданный для этого контейнер
std::string
, для статических массивов —
std::array
, для динамических —
std::vector
. И ничего не будет вылетать.