Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Почему освобождается память |
Автор: MaxWave 15.1.2009, 19:39 | ||
Но по выходе из программы все становится во круги своя. Почему занятая мной память система очищает? Где же утечки памяти? |
Автор: vinter 15.1.2009, 19:50 |
потомучто это свойство ОС. Память занимаемая твоей программой является таковой, только то время пока программа живет. |
Автор: MaxWave 15.1.2009, 19:55 |
Тогда в чем смысл утечек памяти??? |
Автор: vinter 15.1.2009, 20:06 |
в том, что программы работают долго, и не выполняются один раз в main $) |
Автор: MaxWave 15.1.2009, 20:18 |
т.е. система гарантирует что АБСОЛЮТНО ВСЯ память, которую использовало приложение, будет освобождена при выходе из программы? |
Автор: vinter 15.1.2009, 20:26 |
да |
Автор: Dem_max 16.1.2009, 06:23 | ||
В том утечки памяти мешают работе твоей же программе (есть утечки - жди глюка проги), ну и в глобальном случае, могут быстро отъедать память у винды. |
Автор: MaxWave 16.1.2009, 13:32 |
Ясно, всем спасибо. Я просто думал что утечки это именно утрата памяти из за неправильной работы риложния, даже после завершения. |
Автор: Lycifer 18.1.2009, 13:55 |
В современных ос вся память чистится после завершение программы. Вы привели пример когда память создается один раз и живет все продолжительность программы. Есть статья (к сожалению автора не помню) в которой он обсуждает вопрос что считается утечкой памяти , а что нет, к примеру patern singleton , создается объект один раз и используется все время работы программы, та что можно не делать освобождение памяти, но это считается плохим стилем программирование. |
Автор: vinter 18.1.2009, 15:11 |
синглтон плох? |
Автор: Lycifer 18.1.2009, 16:46 |
mes,vinter - я же не писал что singleton плох, я писал что не освобождение памяти плохой стиль программирования. P.S. Синголтон можно и освобождать, я приводил это в пример. |
Автор: EvilsInterrupt 18.1.2009, 18:38 |
От таких ответов и мне не понятно что такое "Утечка памяти". Попробую пояснить, что такое утечка памяти для системного программиста. Следуюет понимать, что современные программы это запускаемые исполнимые модули, в которых указываются нужные значения, к примеру стартовое значение стека, его максимум, стартовое значение памяти, ее максимум и ряд других. Когда линкер строит исполнимый модуль, он не может знать всех мыслимых ситуаций, в которых возможно окажется программа и ставит свойства файла по дефолту! Что происходит когда программа запросила память, а стартовое значение исчерпано ? Правильно, его выделяет диспетчер памяти операционой системы. Что произойдет если программа вдруг освобождает память ? Правильно, диспетчер памяти не освобождает его до тех пор пока программа не завершится! Это не сложно проверить, запустить какую нить программу с большим циклом, увидеть что компьютер стал реагировать менее гибко и потом убить через диспетчер задач, после этого увидим что система начала откликаться. Так вот ситуация, когда программа содержит код в котором заказывается память, но вдруг не освобождаясь, а по логике кода должна, но заказывается еще, возникает ситуация. Эта ситуация называется утечкой памяти. Еще раз, когда приложение заказывает и заказывает и заказывает и заказывает .... , т.е. системе сложно обслуживать другие программы, т.к. все больше и больше расходуется кол-во времени на обслуживание программы с большим кол-вом памяти. Потому что мало того нужно востановить процесс, нужно настроить контексты потоков, нужно подгрузить память из своп-файла, настроить системные таблицы по работе с памятью, ну и ряд других организационных вопросов. Мои слова выше предназначены только для пояснение того, что примерно происходит при выполнении программы. Правильное и точное понимание процессов описаны не мною тут, а такими людьми как Марк Руссинович или Джефри Рихтер. |
Автор: mes 18.1.2009, 19:00 | ||||
![]()
![]() |
Автор: EvilsInterrupt 18.1.2009, 19:14 | ||
mes, ты прав не до писал мысль. под выделенной тобою текстом следует читать: цикл где выделяется память,но не освобождается память, простенький пример:
|
Автор: pan2004 18.1.2009, 19:21 | ||||||
как говориться, От таких ответов и мне не понятно что такое "Утечка памяти". Ich verstehe dich nicht ![]() Если взять стек, то его максимум устанавливается загрузчиком при старте программы - это ясно. Но при исчерпании стека, увы, программа завершает работу, а не происходит выделение нового участка памяти(даже если свободной еще навалом)
Да ладно! ![]()
чтото не видно, чтобы память "утекала".... |
Автор: vinter 18.1.2009, 20:11 | ||
разве, а не при компиляции ли он выставляется? |
Автор: EvilsInterrupt 18.1.2009, 23:28 | ||
vinter, загрузчиком соглассно параметром что выставлены в PE-заголовке, в IMAGE_OPTIONAL_HEADER.SizeOfStackCommit . pan2004,
ты не слышал о выражении "знания" нужно выдавать по крупицам ? Я же дал заметку и оговорку, что я не абсолютно прав и что искать правду надо у дяденек с имнеми Руссинович и Рихтер. Я лишь написал что из себя представляет "примерно" процесс утякания памяти. Когда чел получит это представление, он сможет дальше идти, уточняя для себя нюансы. А если сразу же выволить ему у него каша в голове будет, которую потом разгребай и разгребай. |
Автор: mes 19.1.2009, 00:01 | ||
Может я и ошибаюсь, но в том вышеизложеном объяснении, имхо, Вы больше запутали (или запутались), чем дали крупицу знания для разгребания. ![]() |
Автор: baldina 19.1.2009, 03:52 |
в данном случае я бы разделил утечки памяти на два класса: 1. утечки памяти в самой программе. это когда программа переходит в одно и то же состояние, но при этом потребляемая память растет. пример: приложение открывает файл, обрабатывает, закрывает. теперь оно готово к следующей обработке. но если память, выделенная во время обработки (и более не нужная) не освобождена, есть факт утечки. после завершения программы (процесса) вся такая память возвращается в систему. 2. утечка памяти ОС. это когда программа запрашивает ресурсы (т.е. не обязательно память напрямую) у ОС, но не освобождает. Не все выделяемые ресурсы ОС может контролировать, поэтому часть памяти может быть не возвращена в систему после завершения процесса. |
Автор: MAKCim 19.1.2009, 09:48 | ||
в общем мое определение утечки памяти (думаю достаточно формальное) блок памяти аллокатора (malloc) считается потерянным, если не существует ни одного объекта-указателя, который бы содержал адрес этого блока соответственно, утечка памяти - это наличие хотя бы одного такого блока Добавлено @ 09:49
например? ![]() |
Автор: baldina 19.1.2009, 12:48 |
признаю, выразился неточно. контролировать ресурсы - обязанность ОС. когда выделяются системные ресурсы (например объекты GDI), память для них отводится либо в адресном пространстве процесса - в этом случае после завершения процесса память возвращается в систему автоматически, либо в адресном пространстве ядра - в этом случае тоже должно быть автоматически. на деле, увы, не всегда так. примеры - начиная с проблем с DeleteObject в Windows 3.x (в ней ресурсы GDI выделялись в общей памяти и был баг с автоматическим освобождением. подробности не помню, давно было) и до проблем с утечками памяти в драйверах. их http://search.microsoft.com/results.aspx?mkt=en-US&setlang=en-US&q=memory%20leak |
Автор: Dem_max 19.1.2009, 13:35 |
Вроде до сих пор в XP есть проблемы с освобождением ресурсов GDI, если не освободил и закрыл программу, то для ОС они заняты. Но это на уровне разговоров. |
Автор: kolobok0 19.1.2009, 16:17 | ||
ну почему же... если вы будете кушать и кушать память, то система честно вам скажет - я вот тут распределю сейчас, но освободить не смогу...и после отгрузки - увы висит сие хозяйство... ![]() вынь 95 и 98 то вообще была критична к этому... всё что выше переносит издевательство..хотя при большом ухищрении и в блоб можно загнать... удачи усем (круглый) |
Автор: ZeroPoint 21.1.2009, 11:28 |
Хех. Рецепт утечки. В обработчике WM_PAINT создавай компат DC выбирай в него BMP картинку, BitBlt в основной DC и _не_удаляй_ после этого созданный DC. В обработчике таймера сделай инвалидацию и перерисовку всего окна. [Не пытайтесь повторить дома ![]() По простому: 1. Утечка - потерянный (или просто забытый, в смысле очистки) указатель на выделенный блок памяти. Влияет на производительность твоей программы. В какой-то момент память просто перестанет выделяться и произойдет исключение. Тут система просто вычистит весь блок памяти, где жил твой процесс, со всем содержимым (и потерянным тоже). То же происходит при нормальном завершении программы, просто не достигнут предел памяти. 2. Утечка системной памяти - Когда теряется глобальная память, уже влияет на работоспособность системы. Но память и в этом случае очищается системным менеджером, вызывая тормоза. 3. Утечка ресурсов - один из вариантов в начале поста, тяжелый выриант п.2. В этом случае теряется не только память, но и использующие ее обьекты системы, которые тоже ограничены. Например GDI обьектов может быть чуть более 16К (точно не помню), и они расходуются как на нужды системы, так и приложений. Так, что рекомендуется освобождать ресурсы (очищать память), если они уже не нужны, или пока не нужны. Вот для практики, если интересно: http://www.realcoding.net/article/view/109 |