Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2008, 20:27   #1
DeLorean
Новичок
Джуниор
 
Регистрация: 06.04.2008
Сообщений: 2
Вопрос Почему Dispose не освобождает память?

Доброго времени суток.
Я всегда считал, что процедура Dispose особождает выделенную подпрограммой New память для какой-то переменной. Но тут столкнулся с такой проблемой, что по какой-то непонятной мне причине она этого не делает. Вот простой пример:

const n = 100000;

var
x: array[1..n] of ^Integer;
i: Integer;

begin
for i := 1 to n do
begin
x[i] := nil;
New(x[i]);
end;
for i := 1 to n do
begin
Dispose(x[i]);
x[i] := nil;
end;
readln;
end.

Если посмотреть в диспетчер задач, до начала первого цикла программа занимает 2508 Кб оперативной памяти. После его выполнения она начинает использовать 4468 Кб. Внутри тела второго цикла память для всех элементов массива должна освободиться процедурой Dispose. Но после цикла программа продолжает занимать 4468 Кб памяти.

Насколько я понимаю, она её освобождает, но для дальнейшего использования этой же программой. Если кто-нибудь знает, как сделать, чтоб память освобождалась совсем, поделитесь пожалуйста.

Заранее спасибо за ответы.
DeLorean вне форума Ответить с цитированием
Старый 06.04.2008, 21:22   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Dispose, также как и New использует вызовы MemoryManager, который управляет распределением блоков памяти в программах на Delphi. С точки зрения программы после dispose память освобождена. Когда MemoryManager вернет ее Windows это его дело. Так сделано для оптимизации управления памятью.
alexBlack вне форума Ответить с цитированием
Старый 07.04.2008, 19:16   #3
DeLorean
Новичок
Джуниор
 
Регистрация: 06.04.2008
Сообщений: 2
По умолчанию

Да, теперь ясно. Благодарю за ответ
DeLorean вне форума Ответить с цитированием
Старый 07.04.2008, 19:38   #4
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

x[i] := nil; это лишнее ..
особенно второй
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 08.04.2008, 00:17   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Virtson,
Цитата:
x[i] := nil; это лишнее ..
особенно второй
ну, если это полный текст, то, да, а в реальной жизни, часто очень даже не лишний.
Почему то Pascal (впрочем, как и Дельфи) при освобождении переменной не присвает ей NIL :-(
в дельфи даже ввели специальную процедуру:
FreeAndNil( )

попробуйте вот такую вот бредятину выполнить:
Код:
var ss:^string;
begin
  ss := nil;
  New(ss);
  ss^ := 'New String!';
  writeLn(ss^);
  Dispose(ss);
  writeLn(ss^);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оперативная память ogurchik Компьютерное железо 12 12.12.2008 15:42
Оперативная память ogurchik Компьютерное железо 1 02.09.2008 19:39
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05
Память процессов Carbon Безопасность, Шифрование 2 05.05.2007 23:59