Linux программирование в примерах | страница 60
Если вы знаете, что вам понадобится инициализированная нулями память, следует также использовать >calloc()
, поскольку возможно, что память, возвращенная >malloc()
, уже заполнена нулями. Хотя вы, программист, не можете этого знать, >calloc()
может это знать и избежать лишнего вызова >memset()
.
3.2.1.6. Подведение итогов из GNU Coding Standards
Чтобы подвести итоги, процитируем, что говорит об использовании процедур выделения памяти GNU Coding Standards:
Проверяйте каждый вызов >malloc
или >realloc
на предмет возвращенного нуля. Проверяйте >realloc
даже в том случае, если вы уменьшаете размер блока; в системе, которая округляет размеры блока до степени двойки, >realloc
может получить другой блок, если вы запрашиваете меньше памяти.
В Unix >realloc
может разрушить блок памяти, если она возвращает ноль. GNU >realloc
не содержит подобной ошибки: если она завершается неудачей, исходный блок остается без изменений. Считайте, что ошибка устранена. Если вы хотите запустить свою программу на Unix и хотите избежать потерь в этом случае, вы можете использовать GNU >malloc
.
Вы должны считать, что >free
изменяет содержимое освобожденного блока. Все, что вы хотите получить из блока, вы должны получать до вызова >free
.
В этих трех коротких абзацах Ричард Столмен (Richard Stallman) выразил суть важных принципов управления динамической памятью с помощью >malloc()
. Именно использование динамической памяти и принцип «никаких произвольных ограничений» делают программы GNU такими устойчивыми и более работоспособными по сравнению с их Unix-двойниками.
Мы хотим подчеркнуть, что стандарт С требует, чтобы >realloc()
не разрушал оригинальный блок памяти, если она возвращает >NULL
.
3.2.1.7. Использование персональных программ распределения
Набор функций с >malloc()
является набором общего назначения по выделению памяти. Он должен быть способен обработать запросы на произвольно большие или маленькие размеры памяти и осуществлять все необходимые учетные действия при освобождении различных участков выделенной памяти. Если ваша программа выделяет значительную динамическую память, вы можете обнаружить, что она тратит большую часть своего времени в функциях >malloc()
.
Вы можете написать персональную программу распределения — набор функций или макросов, которые выделяют большие участки памяти с помощью >malloc()
, а затем дробят их на маленькие кусочки по одному за раз. Эта методика особенно полезна, если вы выделяете множество отдельных экземпляров одной и той же сравнительно небольшой структуры.