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

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

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

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

Сообщение Alvo » 23.08.2011 11:47:23

Не освобождается память.
При запуске, программа занимает 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 результат тот-же. Я что-то не так делаю или загвоздка в другом?
Alvo
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

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

Сообщение Vadim » 23.08.2011 12:16:37

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

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

Сообщение Alvo » 23.08.2011 12:23:42

Как я понимаю, зарезервированной памятью сможет воспользоваться только эта же программа. Или нет?
Alvo
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

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

Сообщение Vadim » 23.08.2011 12:34:33

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

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

Сообщение Alvo » 23.08.2011 12:49:44

:) Все равно спасибо за помощь.
Если мое предположение верно, то зачем тогда нужна динамическая память? Ведь теоретически программа может зарезервировать всю память и не давать ее использовать ее другим программам. В таком случае без разницы какую память использовать.
Alvo
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

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

Сообщение kipar » 23.08.2011 15:32:20

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

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

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

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

Сообщение pda » 25.08.2011 12:52:11

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

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

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

Сообщение Alvo » 26.08.2011 10:42:28

Мерял диспетчером задач и плагином в 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. Правильна ли эта информация? Если да, то она как раз решает мои вопросы.
Alvo
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

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

Сообщение Brainenjii » 26.08.2011 12:35:32

Правильна ^_^ Проверять на неосвобождённую память лучше heaptrc или valgrind
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение pda » 26.08.2011 15:03:29

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

Разумеется, это современная стратегия работы с памятью. Поскольку диски несоизмеримо медленнее памяти и процессора, то быстрее просто не забирать память у процесса, проверяя что можно взять, когда это нужно, чем пытаться высвободить каждый байт, как это было во времена DOS.
Если вам надо точно знать сколько ваша программа реально использует и без скольки они физически работать не сможет, то единственный способ - получить эту информацию у менеджера памяти (я не помню, предоставляет FreePascal такое по умолчанию) или сделать свою навеску, которая будет считать суммарный объём распределённых блоков.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

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

Сообщение Widowmaker » 26.08.2011 20:32:19

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

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

Сообщение Alvo » 27.08.2011 08:31:17

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


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 8

Рейтинг@Mail.ru