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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Есть класс Cinema, а так же производные от негоВ консольном приложении я создаю список этих классов
И почему нельзя использовать объявление using при виртуальном наследовании?
Почему при выполнении кода оба массива постоянно инициализируются (или, по крайней мере, выводятся на экран) одинаковыми числами? https://wwwonlinegdb
Дана задача, в которой надо ввести числа в массив, при этом, вводить их надо через пробел