Личный опыт разработки ПО

Сборник рецептов

Освобождение памяти занятой контейнером

Прокомментировать

На днях объяснял товарищу, что у некоторых контейнеров (например 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++".

24 января 2010
21:55

Рубрика: C++

Метки:

Оставить комментарий

Я не робот!