Здесь есть несколько возможных вещей.
Во-первых, в большинстве распространенных библиотек времени выполнения C и C ++ память работает так, что когда она выделяется приложению из операционной системы, она редко возвращается обратно в ОС. Когда вы освобождаете его в своей программе, диспетчер памяти new
сохраняет его на случай, если вы снова запросите больше памяти. Если вы это сделаете, он вернет его вам для повторного использования.
Другая причина в том, что сами векторы обычно не уменьшают свой размер, даже если вы их очистите (). Они сохраняют «вместимость», которая была у них на самом высоком уровне, чтобы быстрее их переполнять. Но если вектор когда-либо будет уничтожен, эта память вернется в библиотеку времени выполнения для повторного выделения.
Итак, если вы не уничтожаете свои векторы, они могут сохранять память для вас. Если вы используете что-то в операционной системе для просмотра использования памяти, он, вероятно, не знает, сколько «свободной» памяти ожидает использование в библиотеках времени выполнения, вместо того, чтобы вернуть ее операционной системе.
Причина, по которой использование вашей памяти увеличивается незначительно (а не вовсе), возможно, из-за фрагментации. Это своего рода сложная касательная, но достаточно сказать, что выделение большого количества небольших объектов может усложнить для библиотеки времени выполнения поиск большого фрагмента, когда он в этом нуждается. В этом случае он не может повторно использовать часть памяти, которую он хранит, которую вы уже освободили, потому что она состоит из множества маленьких кусочков. Поэтому он должен пойти в ОС и запросить большой кусок.