ИСТОРИЧЕСКАЯ МОТИВАЦИЯ: Существование не захватывающих групп можно объяснить с помощью скобок. Рассмотрим выражения (a | b) c и a | bc из-за приоритета конкатенации над |, эти выражения представляют собой два разных языка ({ac, bc} и {a, bc} соответственно). Тем не менее, скобки также используются в качестве сопоставимой группы (как объяснялось другими ответами ...).
Если вы хотите иметь скобки, но не захватывать подвыражение, вы используете NON-CAPTURING GROUPS. В этом примере (?: A | b) c
free
не обязательно возвращает память в операционную систему. Чаще всего он просто возвращает эту область памяти в список свободных блоков. Эти свободные блоки могут быть повторно использованы для следующих вызовов malloc
.
Когда системная память будет фактически выпущена, зависит от ОС.
Пример Foe в Windows, даже если вы закрываете программу, память не будет выпущена одновременно. Он сделан для повторного использования при следующем запуске программы.
free()
просто сообщает распределителю, что ваша программа не нуждается в этом блоке . Распределитель может кэшировать его для дальнейшего выделения, или он может вернуть его системе, изменив указатель brk
. Все зависит от реализации.
Когда память распределена и позже свободен, эта память все еще остается с процессом, но отмечена как свободная, поэтому ее можно снова назначить. Это связано с тем, что в противном случае операционная система должна изменять отображение виртуальной памяти процесса каждый раз, когда вы вызываете malloc
или free
, что требует времени.