![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
MaxWave |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 8.3.2006 Репутация: нет Всего: нет |
Но по выходе из программы все становится во круги своя. Почему занятая мной память система очищает? Где же утечки памяти? |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
потомучто это свойство ОС. Память занимаемая твоей программой является таковой, только то время пока программа живет.
|
|||
|
||||
MaxWave |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 8.3.2006 Репутация: нет Всего: нет |
Тогда в чем смысл утечек памяти???
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
в том, что программы работают долго, и не выполняются один раз в main $)
|
|||
|
||||
MaxWave |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 8.3.2006 Репутация: нет Всего: нет |
т.е. система гарантирует что АБСОЛЮТНО ВСЯ память, которую использовало приложение, будет освобождена при выходе из программы?
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
да
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
В том утечки памяти мешают работе твоей же программе (есть утечки - жди глюка проги), ну и в глобальном случае, могут быстро отъедать память у винды. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
MaxWave |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 8.3.2006 Репутация: нет Всего: нет |
Ясно, всем спасибо. Я просто думал что утечки это именно утрата памяти из за неправильной работы риложния, даже после завершения.
|
|||
|
||||
Lycifer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
В современных ос вся память чистится после завершение программы. Вы привели пример когда память создается один раз и живет все продолжительность программы. Есть статья (к сожалению автора не помню) в которой он обсуждает вопрос что считается утечкой памяти , а что нет, к примеру patern singleton , создается объект один раз и используется все время работы программы, та что можно не делать освобождение памяти, но это считается плохим стилем программирование.
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
Lycifer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
mes,vinter - я же не писал что singleton плох, я писал что не освобождение памяти плохой стиль программирования.
P.S. Синголтон можно и освобождать, я приводил это в пример. |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
От таких ответов и мне не понятно что такое "Утечка памяти". Попробую пояснить, что такое утечка памяти для системного программиста.
Следуюет понимать, что современные программы это запускаемые исполнимые модули, в которых указываются нужные значения, к примеру стартовое значение стека, его максимум, стартовое значение памяти, ее максимум и ряд других. Когда линкер строит исполнимый модуль, он не может знать всех мыслимых ситуаций, в которых возможно окажется программа и ставит свойства файла по дефолту! Что происходит когда программа запросила память, а стартовое значение исчерпано ? Правильно, его выделяет диспетчер памяти операционой системы. Что произойдет если программа вдруг освобождает память ? Правильно, диспетчер памяти не освобождает его до тех пор пока программа не завершится! Это не сложно проверить, запустить какую нить программу с большим циклом, увидеть что компьютер стал реагировать менее гибко и потом убить через диспетчер задач, после этого увидим что система начала откликаться. Так вот ситуация, когда программа содержит код в котором заказывается память, но вдруг не освобождаясь, а по логике кода должна, но заказывается еще, возникает ситуация. Эта ситуация называется утечкой памяти. Еще раз, когда приложение заказывает и заказывает и заказывает и заказывает .... , т.е. системе сложно обслуживать другие программы, т.к. все больше и больше расходуется кол-во времени на обслуживание программы с большим кол-вом памяти. Потому что мало того нужно востановить процесс, нужно настроить контексты потоков, нужно подгрузить память из своп-файла, настроить системные таблицы по работе с памятью, ну и ряд других организационных вопросов. Мои слова выше предназначены только для пояснение того, что примерно происходит при выполнении программы. Правильное и точное понимание процессов описаны не мною тут, а такими людьми как Марк Руссинович или Джефри Рихтер. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]()
![]() |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes,
ты прав не до писал мысль. под выделенной тобою текстом следует читать: цикл где выделяется память,но не освобождается память, простенький пример:
|
|||
|
||||
pan2004 |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
как говориться, От таких ответов и мне не понятно что такое "Утечка памяти". Ich verstehe dich nicht ![]() Если взять стек, то его максимум устанавливается загрузчиком при старте программы - это ясно. Но при исчерпании стека, увы, программа завершает работу, а не происходит выделение нового участка памяти(даже если свободной еще навалом)
Да ладно! ![]()
чтото не видно, чтобы память "утекала".... |
||||||
|
|||||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
vinter, загрузчиком соглассно параметром что выставлены в PE-заголовке, в IMAGE_OPTIONAL_HEADER.SizeOfStackCommit .
pan2004,
ты не слышал о выражении "знания" нужно выдавать по крупицам ? Я же дал заметку и оговорку, что я не абсолютно прав и что искать правду надо у дяденек с имнеми Руссинович и Рихтер. Я лишь написал что из себя представляет "примерно" процесс утякания памяти. Когда чел получит это представление, он сможет дальше идти, уточняя для себя нюансы. А если сразу же выволить ему у него каша в голове будет, которую потом разгребай и разгребай. Это сообщение отредактировал(а) EvilsInterrupt - 18.1.2009, 23:28 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Может я и ошибаюсь, но в том вышеизложеном объяснении, имхо, Вы больше запутали (или запутались), чем дали крупицу знания для разгребания. ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в данном случае я бы разделил утечки памяти на два класса:
1. утечки памяти в самой программе. это когда программа переходит в одно и то же состояние, но при этом потребляемая память растет. пример: приложение открывает файл, обрабатывает, закрывает. теперь оно готово к следующей обработке. но если память, выделенная во время обработки (и более не нужная) не освобождена, есть факт утечки. после завершения программы (процесса) вся такая память возвращается в систему. 2. утечка памяти ОС. это когда программа запрашивает ресурсы (т.е. не обязательно память напрямую) у ОС, но не освобождает. Не все выделяемые ресурсы ОС может контролировать, поэтому часть памяти может быть не возвращена в систему после завершения процесса. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
в общем мое определение утечки памяти (думаю достаточно формальное)
блок памяти аллокатора (malloc) считается потерянным, если не существует ни одного объекта-указателя, который бы содержал адрес этого блока соответственно, утечка памяти - это наличие хотя бы одного такого блока Добавлено @ 09:49
например? ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
признаю, выразился неточно.
контролировать ресурсы - обязанность ОС. когда выделяются системные ресурсы (например объекты GDI), память для них отводится либо в адресном пространстве процесса - в этом случае после завершения процесса память возвращается в систему автоматически, либо в адресном пространстве ядра - в этом случае тоже должно быть автоматически. на деле, увы, не всегда так. примеры - начиная с проблем с DeleteObject в Windows 3.x (в ней ресурсы GDI выделялись в общей памяти и был баг с автоматическим освобождением. подробности не помню, давно было) и до проблем с утечками памяти в драйверах. их полно |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Вроде до сих пор в XP есть проблемы с освобождением ресурсов GDI, если не освободил и закрыл программу, то для ОС они заняты. Но это на уровне разговоров.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
kolobok0 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 24.12.2008 Репутация: нет Всего: 2 |
ну почему же... если вы будете кушать и кушать память, то система честно вам скажет - я вот тут распределю сейчас, но освободить не смогу...и после отгрузки - увы висит сие хозяйство... ![]() вынь 95 и 98 то вообще была критична к этому... всё что выше переносит издевательство..хотя при большом ухищрении и в блоб можно загнать... удачи усем (круглый) |
|||
|
||||
ZeroPoint |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
Хех. Рецепт утечки. В обработчике WM_PAINT создавай компат DC выбирай в него BMP картинку, BitBlt в основной DC и _не_удаляй_ после этого созданный DC.
В обработчике таймера сделай инвалидацию и перерисовку всего окна. [Не пытайтесь повторить дома ![]() По простому: 1. Утечка - потерянный (или просто забытый, в смысле очистки) указатель на выделенный блок памяти. Влияет на производительность твоей программы. В какой-то момент память просто перестанет выделяться и произойдет исключение. Тут система просто вычистит весь блок памяти, где жил твой процесс, со всем содержимым (и потерянным тоже). То же происходит при нормальном завершении программы, просто не достигнут предел памяти. 2. Утечка системной памяти - Когда теряется глобальная память, уже влияет на работоспособность системы. Но память и в этом случае очищается системным менеджером, вызывая тормоза. 3. Утечка ресурсов - один из вариантов в начале поста, тяжелый выриант п.2. В этом случае теряется не только память, но и использующие ее обьекты системы, которые тоже ограничены. Например GDI обьектов может быть чуть более 16К (точно не помню), и они расходуются как на нужды системы, так и приложений. Так, что рекомендуется освобождать ресурсы (очищать память), если они уже не нужны, или пока не нужны. Вот для практики, если интересно: http://www.realcoding.net/article/view/109 Это сообщение отредактировал(а) ZeroPoint - 21.1.2009, 12:39 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |