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

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

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

Это можно сделать с помощью vec.shrink_to_fit() shrink_to_fit .

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

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

1 Ответ

0 голосов
/ 21 января 2019

Это можно применить с помощью vec.shrink_to_fit () shrink_to_fit.

На самом деле, shrink_to_fit не не обеспечивает освобождение памяти. Это просто позволяет. Внедрение разрешено не освобождать.

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

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

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

...