На днях объяснял товарищу, что у std::vector метод clear(), хоть и удаляет свое содержимое, но вот выделенную память не возвращает. Например, после запуска следующей программы:
#include <iostream> #include <vector> int main(int argc, char* argv[]) { std::vector<int> data; data.resize(200000); std::cout << data.capacity() << std::endl; data.clear(); std::cout << data.capacity() << std::endl; return 0; } |
Будет выведено:
200000 200000 |
Почему не возвращает? Потому, что есть метод resize и reserve, которые резервируют память и поэтому освободить память было бы крайне некорректно по отношению к ним.
Что же делать? Не паниковать, а после удаления содержимого использовать следующую идиому:
std::vector<int>().swap(data); |
Также может быть полезным освободить незанятую память, например после удаления доброй половины большого контейнера:
std::vector<int>(data).swap(data); |
Спасибо за совет! Не знал что оно так)
Владимир
23 февраля 11 18:23
будет ::shrink_to_fit() освобождать память.
В новом стандарте
14 апреля 11 12:48
Спасибо! Все работает!
Михаил
22 марта 13 16:53