Почему компилятор не ловит ошибку при неправильной работе с динамической переменной

154
14 марта 2019, 07:10
int *varr = new int(5);
for (unsigned int i = 0; i < 5; ++i) {
    varr[i] = i;
}
Answer 1

Компилятор не ловит ошибку, потому что такой цели перед ним не ставится. Для тех, кто может не сразу видит проблему в коде, поясню. Запись вида:

int *varr = new int(5);

приводит к выделению в куче одной единственной переменной типа int (не массив), и инициализации этой переменной числом 5. Таким образом, дальнейшие попытки заполнить массив по указателю varr с выходом за пределы этого одного единственного элемента приводят к неопределённому поведению. С++ не различает сырые указатели на скалярные типы от указателей, за которыми скрывается массив таких объектов.

Если хочется максимально обезопасить себя от проблем выхода за границы массива, стоит использовать хотя бы std::vector и функцию доступа к элементам at. В таком случае, обращение по невалидным индексам сгенерирует исключение, которое можно будет перехватить. Однако всё это по-прежнему будет работать только в процессе выполнения программы. Для того, чтобы найти подобные ошибки в коде как можно раньше, следует воспользоваться всевозможными программами статического анализа кода. Самые очевидные примеры, это CppCheck и Clang Static Analyzer.

READ ALSO
Освобождение памяти в C++

Освобождение памяти в C++

Есть класс Cinema, а так же производные от негоВ консольном приложении я создаю список этих классов

154
Почему объявление using вводит не тот метод базового класса, который указан

Почему объявление using вводит не тот метод базового класса, который указан

И почему нельзя использовать объявление using при виртуальном наследовании?

169
Инициализация двух массивов

Инициализация двух массивов

Почему при выполнении кода оба массива постоянно инициализируются (или, по крайней мере, выводятся на экран) одинаковыми числами? https://wwwonlinegdb

183
Как записать несколько чисел в одном рядке в массив [закрыт]

Как записать несколько чисел в одном рядке в массив [закрыт]

Дана задача, в которой надо ввести числа в массив, при этом, вводить их надо через пробел

160