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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
newbie666
Заблокирован
#1

Как освобождает память STL (на простом примере) - C++

24.09.2013, 13:35. Просмотров 556. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
какая - то функция
{
    struct ITEM
    {
         std::wstring a;
         std::wstring b;
    }
    
    ITEM *array = new ITEM[10];
    ....
    в цикле как - то присваиваем значения каждому элементу
    return 0;
}
Вот интересно, освободится ли сама память после выхода из функции ? Если нет, то как правильно её освободить? Может вызывать для а и b каждого элемента массивы clear() ?

Добавлено через 3 минуты
или перед выходом нужно вызвать delete[] array и тогда для каждого элемента будет вызван деструктор и как следствие для а и b каждого элемента будет вызван свой деструктор, а по скольку это контейнеры stl - будет вызван для них clear(), который и освободит память... Но возможно он её не освободит, а просто назначит значение элементов 0, а размер контейнера и как следствие - размер занимаемой им памяти останется прежний... Емаё, как правильно освободить память в таком случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 13:35     Как освобождает память STL (на простом примере)
Посмотрите здесь:

delete[] не освобождает память? C++
C++ Освобождает ли
Объясните, как в данном примере работает friend C++
Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память C++
C++ Объясните на данном примере как работать с композицией
Сколько памяти освобождает delete C++
C++ Освобождает ли память процесса менеджер памяти Windows?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 13:40     Как освобождает память STL (на простом примере) #2
Цитата Сообщение от newbie666 Посмотреть сообщение
Вот интересно, освободится ли сама память после выхода из функции ?
Нет, потому что выделена в динамической памяти.
Цитата Сообщение от newbie666 Посмотреть сообщение
Если нет, то как правильно её освободить?
Сохранить указатель на эту память (возвратить из функции), и когда нужно освободить:
C++
1
delete [] array;
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 254
24.09.2013, 13:40     Как освобождает память STL (на простом примере) #3
мне кажется delete[] array;
на автоматическую очистку памяти я бы не надеялся. когда ручками прописано оно недежнее как-то.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 13:44     Как освобождает память STL (на простом примере) #4
Цитата Сообщение от HedgehogLu Посмотреть сообщение
на автоматическую очистку памяти я бы не надеялся. когда ручками прописано оно недежнее как-то.
Тут и не будет автоматической (для памяти, выделенной через new). Если через new выделялась, то через delete нужно освобождать.
newbie666
Заблокирован
24.09.2013, 13:44  [ТС]     Как освобождает память STL (на простом примере) #5
Цитата Сообщение от alsav22 Посмотреть сообщение
delete [] array;
Ну как вариант я это тоже предложил, но освободит ли в таком случае КОНТЕЙНЕР (std::wstring) свою память? Он же небойсь clear() вызовет для строки да и всё, а этот clear() вроде память то не освобождает....
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 13:53     Как освобождает память STL (на простом примере) #6
Цитата Сообщение от newbie666 Посмотреть сообщение
но освободит ли в таком случае КОНТЕЙНЕР (std::wstring) свою память?
Это класс с автоматическим управлением памятью.
newbie666
Заблокирован
24.09.2013, 13:59  [ТС]     Как освобождает память STL (на простом примере) #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Это объекты с автоматическим управлением памятью.
Ну значит освободит? А почему же после вызова std::string clear() его capacity сохраняется? Очень подозрительно... Наверное не освобождает нихрена
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 254
24.09.2013, 14:00     Как освобождает память STL (на простом примере) #8
Да моих познаний тут явно мало. Да и не углублялся я слишком. Запомнил раз и на всегда. Выделил память - будь любезен освободи когда нужна, и не надейся что это сделают за тебя. А у любой функции выделения памяти есть обратная Вот и вся премудрость
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
24.09.2013, 14:15     Как освобождает память STL (на простом примере) #9
Цитата Сообщение от newbie666 Посмотреть сообщение
А почему же после вызова std::string clear() его capacity сохраняется? Очень подозрительно... Наверное не освобождает нихрена
Ты понимаешь разницу между size() и capacity() ?
( http://www.cplusplus.com/reference/s...c_string/size/ vs http://www.cplusplus.com/reference/s...ring/capacity/ )
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 14:18     Как освобождает память STL (на простом примере) #10
Цитата Сообщение от newbie666 Посмотреть сообщение
А почему же после вызова std::string clear() его capacity сохраняется?
clear не равнозначен освобождению памяти. К нему требование такое: size должне стать 0. В разных реализациях clear может работать по разному: в каких-то сделает capacity 0, в каких-то нет.
http://alenacpp.blogspot.ru/search?q=clear
newbie666
Заблокирован
24.09.2013, 14:25  [ТС]     Как освобождает память STL (на простом примере) #11
ТАК CLEAR ОСВОБОДИТ ПАМЯТЬ ИЛИ НЕТ?

Или для полного освобождения памяти надо сделать resize(0) ? Или сначала clear, а потом resize(0) ? Или же после вызова delete для стринга, stl всё это сделает за меня ?
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 14:34     Как освобождает память STL (на простом примере) #12
Цитата Сообщение от newbie666 Посмотреть сообщение
ТАК CLEAR ОСВОБОДИТ ПАМЯТЬ ИЛИ НЕТ?
Или для полного освобождения памяти надо сделать resize(0) ? Или сначала clear, а потом resize(0) ?
По ссылке почитали?
Цитата Сообщение от newbie666 Посмотреть сообщение
Или же после вызова delete для стринга, stl всё это сделает за меня ?
Ага... Не вы выделяли, не вам и освобождать. Только не "delete для стринга", а delete для массива, созданного с помощью new.
newbie666
Заблокирован
24.09.2013, 14:37  [ТС]     Как освобождает память STL (на простом примере) #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Ага... Не вы выделяли, не вам и освобождать. Только не delete для стринга, а delete для массива, созданного с помощью new.
В общем, если "без воды", то если я сделаю delete[] для массива (см первый пост), то память полностью нормально освободится, да?
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 14:37     Как освобождает память STL (на простом примере) #14
Кстати, string - это не STL.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 14:57     Как освобождает память STL (на простом примере)
Еще ссылки по теме:

Управление потоками на простом примере C++
C++ Нужно по коду написать описание как на примере
C++ Stl vector, не резервирует память
C++ Объясните как работает полиморфизм на моем примере
C++ Слово return в простом примере с наследованием классов

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 14:57     Как освобождает память STL (на простом примере) #15
Цитата Сообщение от newbie666 Посмотреть сообщение
то если я сделаю delete[] для массива (см первый пост), то память полностью нормально освободится, да?
Я думаю, да. В крайнем случае, это не забота программиста. Он должен за своими делами следить.

Добавлено через 18 минут
В этом коде поставьте точку останова на delete, запустите и посмотрите (хоть в диспетчере задач), как у вас расход памяти будет меняться:
C++
1
2
3
4
5
6
7
8
9
10
11
 
    const int N = 100000;
    string *arr = new string[N];
 
    string str;
    str.resize(2000);
   
    for (int i = 0; i < N; ++i)
        arr[i] = str;
 
    delete [] arr;
Yandex
Объявления
24.09.2013, 14:57     Как освобождает память STL (на простом примере)
Ответ Создать тему
Опции темы

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