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

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

Восстановить пароль Регистрация
 
newbie666
Заблокирован
24.09.2013, 13:35     Как освобождает память STL (на простом примере) #1
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, а размер контейнера и как следствие - размер занимаемой им памяти останется прежний... Емаё, как правильно освободить память в таком случае?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 13:40     Как освобождает память STL (на простом примере) #2
Цитата Сообщение от newbie666 Посмотреть сообщение
Вот интересно, освободится ли сама память после выхода из функции ?
Нет, потому что выделена в динамической памяти.
Цитата Сообщение от newbie666 Посмотреть сообщение
Если нет, то как правильно её освободить?
Сохранить указатель на эту память (возвратить из функции), и когда нужно освободить:
C++
1
delete [] array;
HedgehogLu
 Аватар для HedgehogLu
146 / 67 / 1
Регистрация: 04.09.2013
Сообщений: 250
24.09.2013, 13:40     Как освобождает память STL (на простом примере) #3
мне кажется delete[] array;
на автоматическую очистку памяти я бы не надеялся. когда ручками прописано оно недежнее как-то.
alsav22
5282 / 4801 / 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
5282 / 4801 / 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
 Аватар для HedgehogLu
146 / 67 / 1
Регистрация: 04.09.2013
Сообщений: 250
24.09.2013, 14:00     Как освобождает память STL (на простом примере) #8
Да моих познаний тут явно мало. Да и не углублялся я слишком. Запомнил раз и на всегда. Выделил память - будь любезен освободи когда нужна, и не надейся что это сделают за тебя. А у любой функции выделения памяти есть обратная Вот и вся премудрость
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
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
5282 / 4801 / 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
5282 / 4801 / 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
5282 / 4801 / 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 (на простом примере)
Еще ссылки по теме:

Сколько памяти освобождает delete C++
C++ Освобождает ли память процесса менеджер памяти Windows?
Управление потоками на простом примере C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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 (на простом примере)
Ответ Создать тему
Опции темы

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