Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

24.09.2013, 13:35. Просмотров 655. Ответов 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, а размер контейнера и как следствие - размер занимаемой им памяти останется прежний... Емаё, как правильно освободить память в таком случае?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 13:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как освобождает память STL (на простом примере) (C++):

Управление потоками на простом примере - C++
Покажите на простом примере как это делается. Создаю простую программу, которая выводит на экран таймер на 30 сек. По истечению...

delete[] не освобождает память? - C++
Приветствую! Такая проблема - имеется функция которая должна заменить строку другой строкой по указанному диапазону: void...

Слово return в простом примере с наследованием классов - C++
Добрый день! Ниже приведён код. Подскажите, пожалуйста, для чего тут return . Почему нельзя просто вставить ++ count (или --count)?...

Освобождает ли память процесса менеджер памяти Windows? - C++
Если моя программа допускает кучу memory leaks - ов, то после закрытия процесса программы утерянная (утёкшая) память будет так же...

Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память - C++
Читаю уроки по C++ на форуме, почему то автор не хочет все нормально писать, в гугле ничего нормального не нашел, вот зачем в этой...

Stl vector, не резервирует память - C++
vector не резервирует память и не вставляет элемент std::vector<int> myVector; myVector.reserve(10); ...

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

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

Есть ли связь между STL-stack и stack - высокопроизводительная память? - C++
Куча источников, как всегда много отсебятины, в общем я запутался...

Освобождает ли - C++
Есть функция: void CreateQ() { Document* doc; //Базовый класс cout&lt;&lt;&quot;Создание объекта Queitus (Квитанция):&quot;&lt;&lt;endl&lt;&lt;endl;; ...

Объясните на простом примере пошагово, как решать задачу на Delphi? - Delphi
Пожалуйста объясните на простом примере пошагово, как решать задачу на языке Delphi.

ошибка в простом примере - Delphi
обьясните пожалуйста, как правильно вставить код площади прямоугольного треугольника по двум катетам? var a,b: real begin readln(a);...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru