int *varr = new int(5);
for (unsigned int i = 0; i < 5; ++i) {
varr[i] = i;
}
Компилятор не ловит ошибку, потому что такой цели перед ним не ставится. Для тех, кто может не сразу видит проблему в коде, поясню. Запись вида:
int *varr = new int(5);
приводит к выделению в куче одной единственной переменной типа int (не массив), и инициализации этой переменной числом 5. Таким образом, дальнейшие попытки заполнить массив по указателю varr с выходом за пределы этого одного единственного элемента приводят к неопределённому поведению. С++ не различает сырые указатели на скалярные типы от указателей, за которыми скрывается массив таких объектов.
Если хочется максимально обезопасить себя от проблем выхода за границы массива, стоит использовать хотя бы std::vector и функцию доступа к элементам at. В таком случае, обращение по невалидным индексам сгенерирует исключение, которое можно будет перехватить. Однако всё это по-прежнему будет работать только в процессе выполнения программы. Для того, чтобы найти подобные ошибки в коде как можно раньше, следует воспользоваться всевозможными программами статического анализа кода. Самые очевидные примеры, это CppCheck и Clang Static Analyzer.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости