На днях объяснял товарищу, что у некоторых контейнеров (например std::vector, std::deque, std::string) метод clear(), хоть и удаляет свое содержимое, но вот выделенную память не возвращает. Точнее может вернуть, а может и нет (GCC 4.2.4 и MS VS 2005 не возвращают). Например, после запуска следующей программы:
#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
Что же делать? Не паниковать, а после удаления содержимого использовать следующую идиому:
std::vector<int>().swap(data);
Также может быть полезным освободить незанятую память, например после удаления доброй половины большого контейнера:
std::vector<int>(data).swap(data);
На мой взгляд поведение крайне не интуитивное, я например в свое время об этом узнал из книги Герба Саттера и Андрея Александреску "Стандарты программирования на C++".