Описание этой книги - пример того, как распределение памяти может работать. Это очень распространенный пример, но есть платформы, которые работают по-разному. В нем описывается многозадачная платформа с виртуальной памятью.
Существует два аспекта распределения памяти на платформе многозадачности: сначала задача получает некоторую память из операционной системы; то сама задача управляет собственной памятью. В приведенном вами параграфе описывается первый шаг.
На этой типичной платформе, когда задача запрашивает операционную систему для большей памяти (путем системного вызова ядра, например, с помощью brk
system call в традиционных Unix-системах), ядро операционной системы обнаруживает некоторую физическую память, не используется какой-либо другой задачей, помещает его во внутренние структуры данных как находящиеся в использовании и ссылается на них в карте памяти задачи в конце последовательного сегмента виртуальных адресов, называемых BSS или кучей. Кроме того, эта память обнуляется, так что задача не будет читать некоторые данные, оставленные другой задачей.
Функция malloc
работает, выделяя куски области кучи. Он полностью работает внутри кучи задачи. Это только делает системный вызов, чтобы получить больше памяти, если куча заполнена. На большинстве платформ функция malloc
не перезаписывает память, которую она выделяет, для производительности. Поэтому, когда блок памяти используется впервые после того, как он был получен из операционной системы, он будет обнулен. Но если память уже использовалась внутри задачи, потому что она получена с помощью malloc
, затем освобождается с помощью free
и повторно используется другим malloc
, тогда память будет содержать все, что было поставлено перед ней в первый раз.
Это совсем другая «куча». На самом деле стандарт C не имеет понятия «куча». Слово означает много разных вещей в зависимости от контекста. –
Потому что этого не требуется. Для этого есть 'calloc'. –
Зачем это было? Нет никакого преимущества, и удар производительности может быть значительным. Если вы хотите, чтобы динамическая память была инициализирована до нуля, используйте «calloc (3)». –