int *varr = new int(5);
for (unsigned int i = 0; i < 5; ++i) {
varr[i] = i;
}
1 Answers
Компилятор не ловит ошибку, потому что такой цели перед ним не ставится. Для тех, кто может не сразу видит проблему в коде, поясню. Запись вида:
int *varr = new int(5);
приводит к выделению в куче одной единственной переменной типа int (не массив), и инициализации этой переменной числом 5. Таким образом, дальнейшие попытки заполнить массив по указателю varr с выходом за пределы этого одного единственного элемента приводят к неопределённому поведению. С++ не различает сырые указатели на скалярные типы от указателей, за которыми скрывается массив таких объектов.
Если хочется максимально обезопасить себя от проблем выхода за границы массива, стоит использовать хотя бы std::vector и функцию доступа к элементам at. В таком случае, обращение по невалидным индексам сгенерирует исключение, которое можно будет перехватить. Однако всё это по-прежнему будет работать только в процессе выполнения программы. Для того, чтобы найти подобные ошибки в коде как можно раньше, следует воспользоваться всевозможными программами статического анализа кода. Самые очевидные примеры, это CppCheck и Clang Static Analyzer.
- 28,987
- 13
- 60
- 119
int. Соответственно количество элементов, на которое он указывает, никак не ограничено, а оператор индексированияp[i]работает эквивалентно*(p + i)– user7860670 Oct 27 '18 at 10:03varr, но она является указателем, а указывает она на массив из несколькихint, на массив из одногоintили на отдельное значениеint, компилятор никак не контролирует. А ошибка тут сразу запарывает весь код еще на этапе компиляции, так как некорретный доступ к памяти является Неопределенным Поведением. То есть программа может не скомпилироваться совсем или выдавать рандомные результаты при работе. – user7860670 Oct 27 '18 at 10:17std::vector::at, вдруг обидятся. – AlexGlebe Oct 27 '18 at 12:31