Проблема с динамической памятью.

Форум для изучающих FPC и их учителей.

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

Ответить
Alvo
незнакомец
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

Проблема с динамической памятью.

Сообщение Alvo »

Не освобождается память.
При запуске, программа занимает 1056 Кб. После выделения памяти - 1072 Кб. Но после освобождения количество занимаемой памяти не уменьшается!
Вот код программки:

Код: Выделить всё

type mass=array [1..1000] of integer;
var s:^mass;
i:word;
begin
Readln;
GetMem(s,SizeOf(integer)*1000);
Writeln('GetMem - OK');
Readln;
for i:=1 to 1000 do s^[i]:=1000;
Writeln('Fill Array - OK');
Readln;
FreeMem(s,SizeOf(integer)*1000);
s:=nil;
Writeln('FreeMem - OK');
Readln;
end.

При использовании New и Despose результат тот-же. Я что-то не так делаю или загвоздка в другом?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

На самом деле память освободилась, только осталась зарезервирована за программой. Как только программу закроете, вся память вернётся в систему.
Alvo
незнакомец
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

Сообщение Alvo »

Как я понимаю, зарезервированной памятью сможет воспользоваться только эта же программа. Или нет?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Честно говоря, в этом вопросе я не силён. :)
Alvo
незнакомец
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

Сообщение Alvo »

:) Все равно спасибо за помощь.
Если мое предположение верно, то зачем тогда нужна динамическая память? Ведь теоретически программа может зарезервировать всю память и не давать ее использовать ее другим программам. В таком случае без разницы какую память использовать.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

Динамическая память нужна, чтобы программа могла сначала разместить там одну структуру, потом "освободить" память и разместить там другую структуру.

Alvo писал(а):Ведь теоретически программа может зарезервировать всю память и не давать ее использовать ее другим программам.

Теоретически, у каждой программы есть 4 ГБ виртуальной памяти. Так что выделение памяти одной программой на другие не повлияет.
На практике, если выделить много памяти, то можно забить оперативную память и вызвать сильные тормоза компьютера из-за обращения к своп-файлу (или забить и своп-файл и вызвать еще больше проблем), но зачем?
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

Alvo писал(а):Я что-то не так делаю или загвоздка в другом?

Меряете память какой-нибудь программой, вроде диспетчера задач? Если вам надо точно, то нужны специализированные утилиты, вроде sysiternals'овских и читайте Рихтера, чтобы понять как управление памятью в современных операционках происходит. Если используете Linux или FreeBSD, то утилиты, конечно не подойдут, но Рихтера всё равно можно читать. Принципы управления памятью общие.
Alvo
незнакомец
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

Сообщение Alvo »

Мерял диспетчером задач и плагином в Far 2. После вашего поста замерил с помощью Process Explorer. Везде было то же самое - занимаемое кол-во памяти не уменьшалось. Почитал главу про память у Рихтера в книге Windows via C&C++.
Решил поискать в Гугле дополнительную информацию и нашел такое : "Например, при таком сценарии: 1. выделяем память, 2.обнуляем память (и, возможно, еще как-то ее используем), 3.освобождаем память - операционная система выделит нужное количеству страниц процессу, а затем начнет их постепенно освобождать. При наличии достаточного количества физической памяти страницы могут быть освобождены через несколько часов! Все это время колонка Memory Usage будет показывать, что эти страницы принадлежат процессу (что есть сущая правда), хотя их никто и не использует, и они будут освобождены немедленно, когда понадобятся для чего-нибудь другого. " http://wiki.drweb.com/index.php/%D0%9F%D0%B5%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE_%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B9_Windows_Task_Manager. Правильна ли эта информация? Если да, то она как раз решает мои вопросы.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Правильна ^_^ Проверять на неосвобождённую память лучше heaptrc или valgrind
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

Alvo писал(а):Правильна ли эта информация? Если да, то она как раз решает мои вопросы.

Разумеется, это современная стратегия работы с памятью. Поскольку диски несоизмеримо медленнее памяти и процессора, то быстрее просто не забирать память у процесса, проверяя что можно взять, когда это нужно, чем пытаться высвободить каждый байт, как это было во времена DOS.
Если вам надо точно знать сколько ваша программа реально использует и без скольки они физически работать не сможет, то единственный способ - получить эту информацию у менеджера памяти (я не помню, предоставляет FreePascal такое по умолчанию) или сделать свою навеску, которая будет считать суммарный объём распределённых блоков.
Аватара пользователя
Widowmaker
новенький
Сообщения: 37
Зарегистрирован: 27.04.2011 18:32:04

Сообщение Widowmaker »

Дело обстоит именно так, как говорит pda. Задавал как-то на форуме разработчиков ядра линукс этот вопрос и получал ответы, смысл которых сводится к следующим: (кратко) 1) "на каждый чих не наздравствуешься"; и (более развёрнуто) 2) "мы не будем заставлять систему каждый раз перебирать 1-2 ГБ памяти и перетряхивать несколько тысяч запущенных системных процессов, чтобы по первому твоему требованию освободить твои жалкие 200 метров". Под маздаем, думаю, ситуация аналогичная. :lol:
Alvo
незнакомец
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

Сообщение Alvo »

Всем спасибо за ответы. Все стало ясно :).
Ответить