Если std::map очищается, гарантируется ли освобождение памяти

Если std::vector vec очищается с помощью vec.clear(), выделенная память не должна освобождаться немедленно. size вектора будет равен нулю, но capacity будет/может быть неизменным.

Это очень полезное поведение, поскольку можно очистить большой вектор и присвоить ему новые значения без необходимости дорогостоящего освобождения/выделения памяти. Также память будет меньше дефрагментирована.

Это можно обеспечить с помощью vec.shrink_to_fit()Уменьшать до размеров.

std::map имеет функцию clear, но не shrink_to_fit. Что происходит с необходимой памятью для хранения карты после clear?

cppreference.com утверждает, что карта.очистить() стирает все элементы из контейнера. После этого вызова size() возвращает ноль.

Дерево уничтожается, поэтому узлы освобождаются. Я предполагаю, что дерево могло бы их удержать, но я не думаю, что кто-то так делает.

Matthieu Brucher 21.01.2019 13:17

Что происходит с памятью для узлов, зависит от распределителя, используемого с картой. То же, что и с любым контейнером на основе узла. Вектор отличается из-за необходимости обеспечения непрерывности.

StoryTeller - Unslander Monica 21.01.2019 13:19

map не хранит свои элементы в непрерывной памяти, поэтому мало пользы от наличия емкости, которая фактически не используется.

463035818_is_not_a_number 21.01.2019 13:30

Выделение памяти представляет собой многоступенчатую систему буферизации. Когда память очищается, контейнер не может освободить память для распределитель. Распределитель, который также может реализовывать некоторую буферизацию и может не освобождать память для библиотеки управления память пользовательского пространства (libc), которая также реализует буферизацию и может не освобождать отображение виртуальной памяти, управляемый ядро, что может держать физическая память зарезервированным некоторое время перед его освобождением. .

Oliv 21.01.2019 14:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
450
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Нет. Единственный случай, когда стандартные контейнеры гарантированно освобождают свою память, — это их уничтожение.

Карта не имеет концепции емкости, которую имеет вектор, поэтому ей не требуется уменьшите_до_подгонки. Карта после очистки находится в той же ситуации, что и вектор после очистки + сжатие_в_подгонку: ему не нужно выделять какую-либо память... но ее выделение также не запрещено.

Другие вопросы по теме