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

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

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

комментария 3


Warning: require() [function.require]: Unable to allocate memory for pool. in /home/c/cl11353/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3756

Warning: require() [function.require]: Unable to allocate memory for pool. in /home/c/cl11353/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3756

Warning: require() [function.require]: Unable to allocate memory for pool. in /home/c/cl11353/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3756

На днях объяснял товарищу, что у 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);

24th Январь 2010
21:55

Рубрика: C++

Метки:

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

Подписаться на комментарии по RSS или TrackBack.

  1. Спасибо за совет! Не знал что оно так)

    Владимир

    23 февраля 11 18:23

  2. будет ::shrink_to_fit() освобождать память.

    В новом стандарте

    14 апреля 11 12:48

  3. Спасибо! Все работает!

    Михаил

    22 марта 13 16:53

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