Предполагая, что вы работаете в Linux, причина того, что память из malloc()
и sbrk()
имеет относительно большое различие в расположении, состоит в том, что реализация glibc malloc()
использует sbrk()
для получения памяти, которая функционирует таким образом.как malloc()
вернуться к звонящему.Например, предположим, что начальная внутренняя реализация glibc получает 32 МБ памяти кучи через sbrk()
, а память, возвращенная из malloc()
, будет в этом фрагменте 32 МБ.Если вы затем используете sbrk()
для получения памяти, она будет из памяти, вновь выделенной в конце этого исходного блока 32 МБ, поэтому адреса из malloc()
и sbrk()
будут отличаться.
Обратите внимание, что вы не можете безопасно смешивать использование malloc()
(и calloc()
, realloc()
и т. Д.) И sbrk()
, поскольку внутренняя реализация malloc()
использует sbrk()
для полученияпамять возвращается через malloc()
.В справочной странице Linux malloc()
:
Обычно malloc()
выделяет память из кучи и корректирует размер кучи по мере необходимости, используя sbrk(2)
.При выделении блоков памяти размером более MMAP_THRESHOLD
байтов реализация glibc malloc()
выделяет память как частное анонимное отображение, используя mmap(2)
.MMAP_THRESHOLD
по умолчанию составляет 128 кБ, но настраивается с помощью mallopt(3)
.До Linux 4.7 выделения, выполняемые с использованием mmap(2)
, не зависели от ограничения ресурса RLIMIT_DATA
;начиная с Linux 4.7, это ограничение также применяется для распределений, выполняемых с использованием mmap(2)
.
Когда вы смешиваете malloc()
и sbrk()
в Linux для получения памяти, вы, вероятно, повредите кучу процесса.