Повреждение кучи строками

Допустим, у меня есть этот кусок кода

void someFunction(args..) {
char array[4];
array[0] = 'a';
array[1] = 'b';
array[2] = 'c';
array[3] = 'd';
}

По сути, я понимаю, что в конце массива нет ‘\ 0’.
Когда мы покидаем эту функцию, массив [] выделяется, верно? Может ли тот факт, что в конце нет знака «\ 0», привести к повреждению кучи? Что если такие функции встречаются часто? Это то же самое, если я делаю это:

void someFunction(args..) {
char* array = new char[4];
array[0] = 'a';
array[1] = 'b';
array[2] = 'c';
array[3] = 'd';
//and now i dont call
//delete array;
}

Заранее спасибо за помощь ! 🙂

0

Решение

Нет, ни один из этих случаев не приведет к повреждению кучи.

Завершающий нулевой символ используется для обозначения конца строки библиотечным функциям. Вы не используете здесь никаких библиотечных функций.

В первом случае массив размещается в стеке, и вы указываете точный размер (4). Когда функция вызывается, указатель стека будет уменьшен настолько, чтобы освободить место для этой переменной, а когда он вернется, указатель стека будет увеличен на ту же величину. Фактическое содержимое массива (включая наличие или отсутствие любого завершающего нулевого символа) абсолютно не влияет на этот процесс.

Ваш второй случай вызовет утечку памяти, но все равно не приведет к повреждению кучи, потому что — опять же — вы не используете указатель с любыми библиотечными функциями, которые ожидают этого.

3

Другие решения

Когда мы покидаем эту функцию, array[] распределяется — верно?

Да. Как и любая автоматическая переменная, она уничтожается, когда программа покидает область видимости.

Может ли тот факт, что в конце нет знака «\ 0», привести к повреждению кучи?

Это ничего не испортит, если вы не напишите элемент, который находится вне диапазона; возможно, передав его функции вроде strcpy который может написать произвольное количество символов в него. Но простое создание, запись в пределах его диапазона и уничтожение не принесут никакого вреда. (В любом случае, это вряд ли повредит кучу, так как она в стеке).

Терминатор нужен только для кода, который интерпретирует содержимое массива как строку в стиле C. В целом нет необходимости прерывать работу массивов, и довольно необычно использовать завершенную строку в C ++, что гораздо удобнее std::string тип.

Что если такие функции встречаются часто?

Нет проблем. Каждый раз массив создается в кадре стека функции, который освобождается, когда функция возвращается.

Это то же самое, если я сделаю это: [new без delete]

Это вызывает утечку памяти, поскольку вы выделяете динамический массив, но никогда не освобождаете его. Опять же, это ничего не испортит, так как вы пишете только в пределах массива; но если вы продолжите течь, то в конце концов у вас закончится память.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector