Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему освобождается память, хотя delete я не пишу 
:(
    Опции темы
MaxWave
Дата 15.1.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Код

int main(int argc, char* argv[])
{
    for (int i=0;i<100000000;i++)
        int *а = new int[10];

    return 0;
}


Но по выходе из программы все становится во круги своя. Почему занятая мной память система очищает? Где же утечки памяти?
PM MAIL   Вверх
vinter
Дата 15.1.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



потомучто это свойство ОС. Память занимаемая твоей программой является таковой, только то время пока программа живет.


--------------------
Мой блог
PM MAIL WWW   Вверх
MaxWave
Дата 15.1.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Тогда в чем смысл утечек памяти???
PM MAIL   Вверх
vinter
Дата 15.1.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



в том, что программы работают долго, и не выполняются один раз в main $)


--------------------
Мой блог
PM MAIL WWW   Вверх
MaxWave
Дата 15.1.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



т.е. система гарантирует что АБСОЛЮТНО ВСЯ память, которую использовало приложение, будет освобождена при выходе из программы?
PM MAIL   Вверх
vinter
Дата 15.1.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



да


--------------------
Мой блог
PM MAIL WWW   Вверх
Dem_max
Дата 16.1.2009, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Тогда в чем смысл утечек памяти???

В том утечки памяти мешают работе твоей же программе (есть утечки - жди глюка проги), ну и в глобальном случае, могут быстро отъедать память у винды.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
MaxWave
Дата 16.1.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Ясно, всем спасибо. Я просто думал что утечки это именно утрата памяти из за неправильной работы риложния, даже после завершения.
PM MAIL   Вверх
Lycifer
Дата 18.1.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



В современных ос вся память чистится после завершение программы. Вы привели пример когда память создается один раз и живет все продолжительность программы.  Есть статья (к сожалению автора не помню) в которой он обсуждает вопрос что считается утечкой памяти , а что нет, к примеру patern singleton , создается  объект один раз и используется все время работы программы, та что можно не делать освобождение памяти, но это считается плохим стилем программирование.
PM MAIL ICQ   Вверх
mes
Дата 18.1.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lycifer @  18.1.2009,  12:55 Найти цитируемый пост)
к примеру patern singleton , создается  объект один раз и используется все время работы программы, та что можно не делать освобождение памяти, но это считается плохим стилем программирование. 

синглетон плох не из за того, что живет все время. 


--------------------
PM MAIL WWW   Вверх
vinter
Дата 18.1.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  18.1.2009,  14:59 Найти цитируемый пост)
синглетон плох не из за того, что живет все время. 

синглтон плох?


--------------------
Мой блог
PM MAIL WWW   Вверх
Lycifer
Дата 18.1.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



mes,vinter - я же не писал что singleton плох, я писал что не освобождение памяти плохой стиль программирования.

P.S. Синголтон можно и освобождать, я приводил это в пример.
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 18.1.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



От таких ответов и мне не понятно что такое "Утечка памяти". Попробую пояснить, что такое утечка памяти для системного программиста.

Следуюет понимать, что современные программы это запускаемые исполнимые модули, в которых указываются нужные значения, к примеру стартовое значение стека, его  максимум, стартовое значение памяти, ее максимум и ряд других. Когда линкер строит исполнимый модуль, он не может знать всех мыслимых ситуаций, в которых возможно окажется программа и ставит свойства файла по дефолту!

Что происходит когда программа запросила память, а стартовое значение исчерпано  ? Правильно, его выделяет диспетчер памяти операционой системы. Что произойдет если программа вдруг освобождает память ? Правильно,  диспетчер памяти не освобождает его до тех пор пока программа не завершится! Это не  сложно проверить, запустить какую нить программу с большим циклом, увидеть что компьютер стал реагировать менее гибко и потом убить через диспетчер задач, после этого увидим что система начала откликаться. 

Так вот ситуация, когда программа содержит код в котором заказывается память, но вдруг не освобождаясь, а по логике кода должна, но заказывается еще, возникает ситуация. Эта ситуация называется утечкой памяти. Еще раз, когда приложение заказывает и заказывает и заказывает и заказывает .... , т.е. системе сложно обслуживать другие программы, т.к. все больше и больше расходуется кол-во времени на обслуживание программы с большим кол-вом памяти. Потому что мало того нужно востановить процесс, нужно  настроить контексты потоков, нужно подгрузить память из своп-файла, настроить системные таблицы по работе с памятью, ну и ряд других организационных вопросов.

Мои слова выше предназначены только для пояснение того, что примерно  происходит при выполнении программы. Правильное и точное понимание процессов описаны не мною тут, а такими людьми как Марк Руссинович или Джефри Рихтер.


PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 18.1.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  18.1.2009,  17:38 Найти цитируемый пост)
Это не  сложно проверить, запустить какую нить программу с большим циклом, увидеть что компьютер стал реагировать менее гибко и потом убить через диспетчер задач, после этого увидим что система начала откликаться. 

 smile А при чем тут (также как и во всей остальной части поста) утечка памяти ? 

Цитата(EvilsInterrupt @  18.1.2009,  17:38 Найти цитируемый пост)
От таких ответов и мне не понятно что такое "Утечка памяти". 

 smile 


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 18.1.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



mes
ты прав не до писал мысль. под выделенной тобою текстом следует читать:
цикл где выделяется память,но  не освобождается память, простенький пример:


Код

#define MAX_INT_ARRAY 0x10000
int * pmem;

while(lContinue)
{
  pmem = new int[MAX_INT_ARRAY];
}

PM MAIL WWW ICQ Jabber   Вверх
pan2004
Дата 18.1.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



Цитата(EvilsInterrupt @  18.1.2009,  18:38 Найти цитируемый пост)
Что происходит когда программа запросила память, а стартовое значение исчерпано  ? Правильно, его выделяет диспетчер памяти операционой системы.

как говориться, От таких ответов и мне не понятно что такое "Утечка памяти". Ich verstehe dich nicht smile 
Если взять стек, то его максимум устанавливается загрузчиком при старте программы - это ясно. Но при исчерпании стека, увы, программа завершает работу, а не происходит выделение нового участка памяти(даже если свободной еще навалом)
Цитата(EvilsInterrupt @  18.1.2009,  18:38 Найти цитируемый пост)
Что произойдет если программа вдруг освобождает память ? Правильно,  диспетчер памяти не освобождает его до тех пор пока программа не завершится!

Да ладно! smile 

Код

int main()
{
  int* a = 0;
  do{
    a = new int;
    delete a;
  }while (true);
  return 0;
}

чтото не видно, чтобы память "утекала"....


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vinter
Дата 18.1.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(pan2004 @  18.1.2009,  20:21 Найти цитируемый пост)
Если взять стек, то его максимум устанавливается загрузчиком при старте программы - это ясно

разве, а не при компиляции ли он выставляется?


--------------------
Мой блог
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 18.1.2009, 23:28 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



vinter, загрузчиком соглассно параметром что выставлены в PE-заголовке, в IMAGE_OPTIONAL_HEADER.SizeOfStackCommit . 


pan2004

Цитата

Да ладно!  


ты не слышал о выражении "знания" нужно выдавать по крупицам ? Я же дал заметку и оговорку, что я не абсолютно прав и что искать правду надо у дяденек с имнеми Руссинович и Рихтер.

Я лишь написал что из себя представляет "примерно" процесс утякания памяти. Когда чел получит это представление, он сможет дальше идти, уточняя для себя нюансы. А если сразу же выволить ему у него каша в голове будет, которую потом разгребай и разгребай.

Это сообщение отредактировал(а) EvilsInterrupt - 18.1.2009, 23:28
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 19.1.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  18.1.2009,  22:28 Найти цитируемый пост)
Я лишь написал что из себя представляет "примерно" процесс утякания памяти. Когда чел получит это представление, он сможет дальше идти, уточняя для себя нюансы. А если сразу же выволить ему у него каша в голове будет, которую потом разгребай и разгребай.

Может я и ошибаюсь, но в том вышеизложеном объяснении, имхо, Вы больше запутали (или запутались), чем дали крупицу знания для разгребания.  smile 


--------------------
PM MAIL WWW   Вверх
baldina
Дата 19.1.2009, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



в данном случае я бы разделил утечки памяти на два класса:
1. утечки памяти в самой программе. это когда программа переходит в одно и то же состояние, но при этом потребляемая память растет. пример: приложение открывает файл, обрабатывает, закрывает. теперь оно готово к следующей обработке. но если память, выделенная во время обработки (и более не нужная) не освобождена, есть факт утечки. 
после завершения программы (процесса) вся такая память возвращается в систему.
2. утечка памяти ОС. это когда программа запрашивает ресурсы (т.е. не обязательно память напрямую) у ОС, но не освобождает. Не все выделяемые ресурсы ОС может контролировать, поэтому часть памяти может быть не возвращена в систему после завершения процесса.
PM MAIL   Вверх
MAKCim
Дата 19.1.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



в общем мое определение утечки памяти (думаю достаточно формальное)

блок памяти аллокатора (malloc) считается потерянным, если не существует ни одного объекта-указателя, который бы содержал адрес этого блока
соответственно, утечка памяти - это наличие хотя бы одного такого блока

Добавлено @ 09:49
Цитата(baldina @  19.1.2009,  03:52 Найти цитируемый пост)
Не все выделяемые ресурсы ОС может контролировать, поэтому часть памяти может быть не возвращена в систему после завершения процесса. 

например?
 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
baldina
Дата 19.1.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



признаю, выразился неточно. 
контролировать ресурсы - обязанность ОС. 
когда выделяются системные ресурсы (например объекты GDI), память для них отводится либо в адресном пространстве процесса - в этом случае после завершения процесса память возвращается в систему автоматически, либо в адресном пространстве ядра - в этом случае тоже должно быть автоматически. на деле, увы, не всегда так. 
примеры - начиная с проблем с DeleteObject в Windows 3.x (в ней ресурсы GDI выделялись в общей памяти и был баг с автоматическим освобождением. подробности не помню, давно было) и до проблем с утечками памяти в драйверах. их полно
PM MAIL   Вверх
Dem_max
Дата 19.1.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Вроде до сих пор в XP есть проблемы с освобождением ресурсов GDI, если не освободил и закрыл программу, то для ОС они заняты. Но это на уровне разговоров.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
kolobok0
Дата 19.1.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.12.2008

Репутация: нет
Всего: 2



Цитата(Dem_max @ 19.1.2009,  13:35)
Вроде до сих пор в XP есть проблемы...Но это на уровне разговоров.

ну почему же...
если вы будете кушать и кушать память, то система честно вам скажет - я вот тут распределю сейчас, но освободить не смогу...и после отгрузки - увы висит сие хозяйство... smile 

вынь 95 и 98 то вообще была критична к этому... всё что выше переносит издевательство..хотя при большом ухищрении и в блоб можно загнать...


удачи усем
(круглый)
PM MAIL   Вверх
ZeroPoint
Дата 21.1.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Хех. Рецепт утечки. В обработчике WM_PAINT создавай компат DC выбирай в него BMP картинку, BitBlt в основной DC и _не_удаляй_ после этого созданный DC. 
В обработчике таймера сделай инвалидацию и перерисовку всего окна.
[Не пытайтесь повторить дома smile]

По простому:
1. Утечка - потерянный (или просто забытый, в смысле очистки) указатель на выделенный блок памяти. Влияет на производительность твоей программы. В какой-то момент память просто перестанет выделяться и произойдет исключение. Тут система просто вычистит весь блок памяти, где жил твой процесс, со всем содержимым (и потерянным тоже). То же происходит при нормальном завершении программы, просто не достигнут предел памяти.
2. Утечка системной памяти - Когда теряется глобальная память, уже влияет на работоспособность системы. Но память и в этом случае очищается системным менеджером, вызывая тормоза.  
3. Утечка ресурсов - один из вариантов в начале поста, тяжелый выриант п.2. В этом случае теряется не только память, но и использующие ее обьекты системы, которые тоже ограничены. Например GDI обьектов может быть чуть более 16К (точно не помню), и они расходуются как на нужды системы, так и приложений.

Так, что рекомендуется освобождать ресурсы (очищать память), если они уже не нужны, или пока не нужны.
Вот для практики, если интересно:
http://www.realcoding.net/article/view/109

Это сообщение отредактировал(а) ZeroPoint - 21.1.2009, 12:39
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1374 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.