#include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); void free(void *ptr); void *realloc(void *ptr, size_t size);
malloc() распределяет size байтов и возвращает указатель на распределенную память. Память при этом не "очищается".
free() освобождает место в памяти, на которое указывает ptr, возвращенный, по-видимому, предшествующим вызовом функций malloc(), calloc() или realloc(). Иначе (или если уже вызывался free(ptr)) дальнейший ход событий непредсказуем. Если ptr равен NULL, то не выполняется никаких действий.
realloc() меняет размер блока памяти, на который указывает ptr, на размер, равный size байтов. Содержание будет неизменным в пределах наименьшего из старых и новых размеров, а новая распределенная память будет неинициализирована. Если ptr равно NULL, то данный вызов эквивалентен malloc(size); если размер равен нулю, то данный вызов эквивалентен free(ptr). Если только ptr не равен NULL, он, по-видимому, возвращен более ранним вызовом malloc(), calloc() или realloc().
free() не возвращает значений.
realloc() возвращает указатель на память, которая должным образом повторно распределена для каждого типа переменных и может отличаться от ptr, или возвращает NULL, если запрос завершился с ошибкой. Если size был равен нулю, то возвращается либо NULL, либо указатель, который может быть передан free(). Если realloc() не выполнена, то блок памяти остается нетронутым: он не "очищается" и не перемещается.
Аварийные ситуации в malloc(), free() или realloc() почти всегда связаны с искажением данных кучи, например, с переполнением больших распределенных участков памяти или "освобождением" одного и того же указателя дважды.
Последние версии Linux библиотеки libc (более поздние по сравнению с 5.4.23) и GNU библиотеки libc (2.x) включают в себя реализации malloc, которые настраиваются с помощью переменных окружения. Когда включен MALLOC_CHECK_, то используется специальная (менее эффективная) реализация, устойчивая к простейшим ошибкам, например, к двойным вызовам free() с теми же параметрами или превышению единственного байта (off-by-one bugs). Защититься от всех подобных ошибок, конечно, не получится, к тому же в этом случае могут происходить потери данных памяти. Если MALLOC_CHECK_ установлено равным нулю, то любое замеченное повреждение кучи незаметно игнорируется; если это значение установлено равным 1, то на stderr выводится сообщение об ошибке; а если устанавливаемое значение равно 2-м, то немедленно вызывается abort(). Это может быть полезно, так как иначе сбой может произойти гораздо позднее и настоящую причину ошибки будет очень трудно обнаружить.
Linux следует крайне самоуверенной стратегии распределения памяти. Это означает, что когда malloc() возвращает ненулевое значение, нет никаких гарантий, что память в действительности доступна. Если обнаружится, что системе не хватает памяти, то один или несколько процессов будут подло убиты OOM.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |