ВУЗ:
Составители:
71
сваливается в одну кучу. У каждого занятого блока есть
внутренняя информация о его размере, которую и использует free. После
освобождения памяти free по возможности сливает меньшие участки
свободной памяти в более крупный непрерывный блок, т.е. функции free и
malloc оптимизируют работу со свободной памятью внутри себя.
Однако большие неприятности возникнут, если в функцию free
передать указатель, который не был получен функцией malloc или calloc
(или realloc – см . далее), либо передать указатель на область памяти,
которая уже была освобождена free. Здесь язык C требует внимательности
со стороны программиста, стремясь максимально повысить
производительность программы в ущерб защищенности от неправильных
действий программиста: если программист написал что - то не так , то
программа просто «упадет» (аварийно завершится ).
Если в процессе работы программы оказывается, что размера ранее
выделенной области динамической памяти недостаточно , то ее можно
перевыделить при помощи функции realloc, у которой два параметра –
указатель на старую область памяти и требуемый размер новой области в
байтах . Функция realloc выделяет новую область , копирует в нее
содержимое старой области, после чего освобождает старую область и
возвращает указатель на новую область (если выделить новую область не
удается, возвращается NULL и старая область остается неизменной). Если
в функцию realloc передать неправильный указатель, то она, как и функция
free, аварийно завершит программу.
Необходимо помнить , что указатель, возвращаемый функцией
realloc, отличается от старого указателя. Поэтому, если на область памяти
ссылались несколько указателей , то все их необходимо переприсвоить .
Замечание . В языке C++ для динамического выделения и
освобождения памяти вместо malloc/free целесообразнее использовать
операции new и delete, которые являются частью языка. Функции malloc и
free входят в стандартную библиотеку языка C, но не входят в сам язык.
6.4.3 Динамические массивы
Так как указатели можно индексировать , то реализовать одномерные
динамические массивы очень легко : надо лишь выделить память под
нужное количество элементов N заданного типа (т.е. область памяти
71
сваливается в одну кучу. У каждого занятого блока есть
внутренняя информация о его размере, которую и использует free. После
освобождения памяти free по возможности сливает меньшие участки
свободной памяти в более крупный непрерывный блок, т.е. функции free и
malloc оптимизируют работу со свободной памятью внутри себя.
Однако большие неприятности возникнут, если в функцию free
передать указатель, который не был получен функцией malloc или calloc
(или realloc – см. далее), либо передать указатель на область памяти,
которая уже была освобождена free. Здесь язык C требует внимательности
со стороны программиста, стремясь максимально повысить
производительность программы в ущерб защищенности от неправильных
действий программиста: если программист написал что-то не так, то
программа просто «упадет» (аварийно завершится).
Если в процессе работы программы оказывается, что размера ранее
выделенной области динамической памяти недостаточно, то ее можно
перевыделить при помощи функции realloc, у которой два параметра –
указатель на старую область памяти и требуемый размер новой области в
байтах. Функция realloc выделяет новую область, копирует в нее
содержимое старой области, после чего освобождает старую область и
возвращает указатель на новую область (если выделить новую область не
удается, возвращается NULL и старая область остается неизменной). Если
в функцию realloc передать неправильный указатель, то она, как и функция
free, аварийно завершит программу.
Необходимо помнить, что указатель, возвращаемый функцией
realloc, отличается от старого указателя. Поэтому, если на область памяти
ссылались несколько указателей, то все их необходимо переприсвоить.
Замечание. В языке C++ для динамического выделения и
освобождения памяти вместо malloc/free целесообразнее использовать
операции new и delete, которые являются частью языка. Функции malloc и
free входят в стандартную библиотеку языка C, но не входят в сам язык.
6.4.3 Динамические массивы
Так как указатели можно индексировать, то реализовать одномерные
динамические массивы очень легко: надо лишь выделить память под
нужное количество элементов N заданного типа (т.е. область памяти
Страницы
- « первая
- ‹ предыдущая
- …
- 69
- 70
- 71
- 72
- 73
- …
- следующая ›
- последняя »
