ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »