Распределение памяти запрашивает у компьютера некоторую память для хранения данных.Например, в C ++:
int* myInts = new int[howManyIntsIWant];
говорит компьютеру выделить мне достаточно памяти для хранения некоторого числа целых чисел.
Другой способ сделать то же самое будет:
int myInts[6];
Разница здесь в том, что во втором примере мы знаем, когда код написан и скомпилирован, сколько именно места нам нужно - это 6 * размер одного целого.Это позволяет нам делать статическое выделение памяти (которое использует память в так называемом «стеке»).
В первом примере мы не знаем, сколько места требуется при компиляции кода, мы знаем это толькокогда программа запущена и у нас есть значение howManyIntsIWant.Это динамическое распределение памяти, которое получает память в «куче».
Теперь при статическом распределении нам не нужно сообщать компьютеру, когда мы закончили с памятью.Это относится к тому, как работает стек;короткая версия состоит в том, что после того, как мы оставили функцию, в которой мы создали этот статический массив, память сразу же проглатывается.
При динамическом распределении этого не происходит, поэтому необходимо очистить памятькаким-то другим способом.На некоторых языках вы должны написать код, чтобы освободить эту память, на других это делается автоматически.Это сборка мусора - некоторый автоматический процесс, встроенный в язык, который будет проходить через все динамически распределяемые памяти в куче, определять, какие биты не используются, и освобождать их (то есть освобождать их для других процессов и программ).
Итак: выделение памяти = запрос памяти для вашей программы.Сборка мусора = где сам язык программирования определяет, какая память больше не используется, и освобождает ее для вас.