Процесс хранит память по двум причинам:
std::vector
перераспределяет память только тогда, когда она увеличивается, а не когда она уменьшается.
- Освобожденная память часто сохраняется процессом для повторного использования.
В C ++ 11 векторы имеют функцию-член shrink_to_fit
, которая попросит вектор уменьшить объем выделенной памяти, если это возможно. Там нет гарантии, что это сделает это, хотя. В C ++ 03 или если вы хотите гарантировать освобождение избыточной памяти, вы можете использовать хитрость замены вектора на вновь выделенный:
std::vector<int>(test).swap(test);
или если вы хотите полностью очистить его:
std::vector<int>().swap(test);
Этот трюк переносит владение выделенной памятью во временный вектор; в конце выражения этот вектор уничтожается, освобождая память.
Независимо от того, была ли освобождена память из процесса, полностью зависит от того, как ваша библиотека управляет бесплатным хранилищем. Часто небольшие выделения (возможно, до нескольких мегабайт) обрабатываются кучей - процесс запрашивает из системы большие блоки памяти и разбивает их на маленькие части. Блоки не могут быть освобождены, пока не будут освобождены все маленькие части, и многие реализации не освободят их даже тогда.
Большие выделения могут быть запрошены непосредственно из системы, и в этом случае они будут освобождены после освобождения.
Таким образом, вы можете получить ожидаемый эффект с помощью такого кода:
// A few gigabytes will probably be allocated directly.
// You'll have to reduce this on a 32-bit system, or if there's not enough memory
std::vector<int> test(1000000000)
// Use the "swap trick" to ensure the memory is deallocated.
std::vector<int>().swap(test);
Но нет никакой гарантии, что даже это освободит память от процесса; детали выделения памяти не определены стандартом и зависят от реализации компилятора / библиотеки.