Страница 1 из 1

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

СообщениеДобавлено: 23.08.2011 11:47:23
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 результат тот-же. Я что-то не так делаю или загвоздка в другом?

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

СообщениеДобавлено: 23.08.2011 12:16:37
Vadim
На самом деле память освободилась, только осталась зарезервирована за программой. Как только программу закроете, вся память вернётся в систему.

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

СообщениеДобавлено: 23.08.2011 12:23:42
Alvo
Как я понимаю, зарезервированной памятью сможет воспользоваться только эта же программа. Или нет?

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

СообщениеДобавлено: 23.08.2011 12:34:33
Vadim
Честно говоря, в этом вопросе я не силён. :)

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

СообщениеДобавлено: 23.08.2011 12:49:44
Alvo
:) Все равно спасибо за помощь.
Если мое предположение верно, то зачем тогда нужна динамическая память? Ведь теоретически программа может зарезервировать всю память и не давать ее использовать ее другим программам. В таком случае без разницы какую память использовать.

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

СообщениеДобавлено: 23.08.2011 15:32:20
kipar
Динамическая память нужна, чтобы программа могла сначала разместить там одну структуру, потом "освободить" память и разместить там другую структуру.

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

Теоретически, у каждой программы есть 4 ГБ виртуальной памяти. Так что выделение памяти одной программой на другие не повлияет.
На практике, если выделить много памяти, то можно забить оперативную память и вызвать сильные тормоза компьютера из-за обращения к своп-файлу (или забить и своп-файл и вызвать еще больше проблем), но зачем?

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

СообщениеДобавлено: 25.08.2011 12:52:11
pda
Alvo писал(а):Я что-то не так делаю или загвоздка в другом?

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

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

СообщениеДобавлено: 26.08.2011 10:42:28
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. Правильна ли эта информация? Если да, то она как раз решает мои вопросы.

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

СообщениеДобавлено: 26.08.2011 12:35:32
Brainenjii
Правильна ^_^ Проверять на неосвобождённую память лучше heaptrc или valgrind

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

СообщениеДобавлено: 26.08.2011 15:03:29
pda
Alvo писал(а):Правильна ли эта информация? Если да, то она как раз решает мои вопросы.

Разумеется, это современная стратегия работы с памятью. Поскольку диски несоизмеримо медленнее памяти и процессора, то быстрее просто не забирать память у процесса, проверяя что можно взять, когда это нужно, чем пытаться высвободить каждый байт, как это было во времена DOS.
Если вам надо точно знать сколько ваша программа реально использует и без скольки они физически работать не сможет, то единственный способ - получить эту информацию у менеджера памяти (я не помню, предоставляет FreePascal такое по умолчанию) или сделать свою навеску, которая будет считать суммарный объём распределённых блоков.

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

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

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

СообщениеДобавлено: 27.08.2011 08:31:17
Alvo
Всем спасибо за ответы. Все стало ясно :).