C ++ Доступ к границам вне статического массива против нового массива? - PullRequest
2 голосов
/ 15 декабря 2011

Почему следующий код компилируется и запускается.

Я создал целочисленный массив и присвоил его размер 10, почему тогда программа не возвращает ошибку, что я пытаюсь получить доступ к элементувне массива, когда внутри цикла for?

Кроме того, я хотел бы понять концепцию нового, правильно ли мое использование (я не назначил, сколько памяти * требует массивов), это мое пониманиеэто новое позволяет мне создавать массив динамического размера (это означает, что я могу бесконечно увеличивать размер этого массива во время выполнения, поправьте меня, если я ошибаюсь).Если это правильно, в чём разница, используя new или просто выделяя массив [];поскольку оба, по-видимому, позволяют мне увеличивать размер моего массива во время выполнения, как видно из этого примера.Я знаю о различиях в области видимости, стеке и куче, поэтому предположим, что обе переменные объявлены только в main, и используйте следующий код в качестве примера.

1 Ответ

3 голосов
/ 15 декабря 2011

Доступ к элементам за пределами массива приводит к неопределенному поведению .
Компиляторам не нужно делать что-то конкретное в таких гарантированных случаях Undefine Behavior.
И потенциально может произойти что-нибудь, ваша программа может аварийно завершить работу или не проявлять неправильное поведение, и это допускается Стандартом.

Ссылка:

C ++ Стандартный раздел 1.3.24 гласит:

Допустимое неопределенное поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время перевода или выполнения программы документированным образом, характерным для среды (с выдачей или без выдачи диагностического сообщения), до завершения перевода или выполнения с выдачей диагностического сообщения).

Ваше понимание new неверно. new позволяет вам выделить фиксированный объем памяти в свободном хранилище (куча a.k.a). Он не выделяет дополнительную память, если вы расширяете границы выделенной памяти. Это зависит от вас, чтобы убедиться, что вы должны выделить достаточно памяти, чтобы вы не выходили за пределы.

В вашей программе вы пытаетесь выделить память, равную 10 элементам массива, поэтому вы должны делать:

arrays = new int[10];

Кроме того, не забудьте позвонить delete[], как только вы закончите, используя выделенную память, или это приведет к утечке памяти.

delete []arrays;

Если вам нужна структура данных, которая автоматически увеличивается в соответствии с вашим использованием, C ++ предоставляет ее в виде std :: vector .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...