Если std::vector vec очищается с помощью vec.clear(), выделенная память не должна освобождаться немедленно. size вектора будет равен нулю, но capacity будет/может быть неизменным.
Это очень полезное поведение, поскольку можно очистить большой вектор и присвоить ему новые значения без необходимости дорогостоящего освобождения/выделения памяти. Также память будет меньше дефрагментирована.
Это можно обеспечить с помощью vec.shrink_to_fit()Уменьшать до размеров.
std::map имеет функцию clear, но не shrink_to_fit. Что происходит с необходимой памятью для хранения карты после clear?
cppreference.com утверждает, что карта.очистить() стирает все элементы из контейнера. После этого вызова size() возвращает ноль.
Что происходит с памятью для узлов, зависит от распределителя, используемого с картой. То же, что и с любым контейнером на основе узла. Вектор отличается из-за необходимости обеспечения непрерывности.
map не хранит свои элементы в непрерывной памяти, поэтому мало пользы от наличия емкости, которая фактически не используется.
Выделение памяти представляет собой многоступенчатую систему буферизации. Когда память очищается, контейнер не может освободить память для распределитель. Распределитель, который также может реализовывать некоторую буферизацию и может не освобождать память для библиотеки управления память пользовательского пространства (libc), которая также реализует буферизацию и может не освобождать отображение виртуальной памяти, управляемый ядро, что может держать физическая память зарезервированным некоторое время перед его освобождением. .





One can enforce that with vec.shrink_to_fit() shrink_to_fit.
На самом деле, shrink_to_fit не освобождает память обеспечивать соблюдение. Он просто позволяет это. Реализации разрешено не освобождать.
If a std::map is cleared is it ensured, that the memory is deallocated
Нет. Единственный случай, когда стандартные контейнеры гарантированно освобождают свою память, — это их уничтожение.
Карта не имеет концепции емкости, которую имеет вектор, поэтому ей не требуется уменьшите_до_подгонки. Карта после очистки находится в той же ситуации, что и вектор после очистки + сжатие_в_подгонку: ему не нужно выделять какую-либо память... но ее выделение также не запрещено.
Дерево уничтожается, поэтому узлы освобождаются. Я предполагаю, что дерево могло бы их удержать, но я не думаю, что кто-то так делает.