Форум программистов, компьютерный форум CyberForum.ru

Еще раз о vector и очистке памяти - C++

Восстановить пароль Регистрация
 
Harb
1 / 1 / 0
Регистрация: 23.03.2014
Сообщений: 79
11.06.2014, 17:21     Еще раз о vector и очистке памяти #1
Привет всем!

Создаю консольное приложение в RAD Studio.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    vector<int> IntVect;
    getch();
    int i;
    for (i = 0; i < 30000; i++)
    {
        IntVect.push_back(i);
    }
    cout<<(int)IntVect.size()<<endl;
    getch();
    IntVect.clear();
    vector<int>().swap(IntVect);
    cout<< IntVect.size()<<endl;
    cout<< IntVect.capacity()<<endl;
    getch();
    return 0;
Я создаю вектор. Заполняю его 100500 элементами, после чего очищаю, и с помощью swap пытаюсь освободить память. При этом size() и capacity() мне показывают 0. Но память занимаемая программой не уменьшается. В чем дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2014, 17:21     Еще раз о vector и очистке памяти
Посмотрите здесь:

C++ Vector string'ов и освобождение памяти
std::vector Перераспределение памяти C++
Vector, очистка памяти C++
reallocation памяти контейнера std::vector C++
C++ Выход за пределы массива при очистке памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 17:31     Еще раз о vector и очистке памяти #2
Цитата Сообщение от Harb Посмотреть сообщение
Но память занимаемая программой не уменьшается. В чем дело?
В том, что менеджер памяти приложения может не сразу возвращать ее системе, на случай, если вдруг она снова понадобится. Это позволяет снизить количество обращений к менеджеру памяти системы. Залей вектор еще раз - занятая память не должна вырасти.
Harb
1 / 1 / 0
Регистрация: 23.03.2014
Сообщений: 79
11.06.2014, 17:41  [ТС]     Еще раз о vector и очистке памяти #3
Спасибо, а можно как-то отслеживать реально занимаемую память в realtime?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 17:44     Еще раз о vector и очистке памяти #4
Цитата Сообщение от Harb Посмотреть сообщение
можно как-то отслеживать реально занимаемую память в realtime?
А зачем? Отслеживать нужно успешное выделение памяти. И корректно обрабатывать ситуацию, когда она кончилась.
Renji
1532 / 980 / 238
Регистрация: 05.06.2014
Сообщений: 2,948
11.06.2014, 21:11     Еще раз о vector и очистке памяти #5
Я создаю вектор. Заполняю его 100500 элементами, после чего очищаю, и с помощью swap пытаюсь освободить память.
Уже не ненужно через swap. В C++11 добавили shrink_to_fit. Но это так, к слову.
Спасибо, а можно как-то отслеживать реально занимаемую память в realtime?
Можно передать вектору свой алокатор который будет отдавать системе более неиспользуемую память. Но мороки много.
Harb
1 / 1 / 0
Регистрация: 23.03.2014
Сообщений: 79
11.06.2014, 21:44  [ТС]     Еще раз о vector и очистке памяти #6
Renji, а для этого что-нибудь подключать надо? Я работаю в RAD Studio 2010, там shrink_to_fit нет .
Renji
1532 / 980 / 238
Регистрация: 05.06.2014
Сообщений: 2,948
11.06.2014, 21:56     Еще раз о vector и очистке памяти #7
Renji, а для этого что-нибудь подключать надо? Я работаю в RAD Studio 2010, там shrink_to_fit нет
Может потребоваться ключик компилятора разрешающий C++11. В Qt это QMAKE_CXXFLAGS += -std=c++11 в pro файл, как в RAD - не знаю.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 22:03     Еще раз о vector и очистке памяти #8
Цитата Сообщение от Harb Посмотреть сообщение
там shrink_to_fit нет
resize(0) - есть везде и давно.
Renji
1532 / 980 / 238
Регистрация: 05.06.2014
Сообщений: 2,948
11.06.2014, 22:23     Еще раз о vector и очистке памяти #9
resize(0) - есть везде и давно.
Вот только ни resize(0), ни clear никому не гарантируют реального освобождения памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    vector<int> test(100);
    cout<<"размер вектора после создания = "<<test.capacity()<<endl;
    test.resize(0);
    cout<<"размер вектора после resize = "<<test.capacity()<<endl;
    test.clear();
    cout<<"размер вектора после clear = "<<test.capacity()<<endl;
    test.shrink_to_fit();
    cout<<"размер вектора после shrink_to_fit = "<<test.capacity()<<endl;
    return 0;
}
Итог:
размер вектора после создания = 100
размер вектора после resize = 100
размер вектора после clear = 100
размер вектора после shrink_to_fit = 0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2014, 22:58     Еще раз о vector и очистке памяти
Еще ссылки по теме:

Std::set( vector ) и расход памяти C++
Windows инициировала точку останова при очистке динамической памяти C++
C++ Vector-коэфицинт выделения памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Harb
1 / 1 / 0
Регистрация: 23.03.2014
Сообщений: 79
11.06.2014, 22:58  [ТС]     Еще раз о vector и очистке памяти #10
Renji прав, resize тут не поможет. Если бы он помогал, никто бы со swap не парился.
Yandex
Объявления
11.06.2014, 22:58     Еще раз о vector и очистке памяти
Ответ Создать тему
Опции темы

Текущее время: 00:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru