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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2010, 00:05   #1
PaulSev
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 5
По умолчанию Динамическая память

Столкнулся с такой проблемой, не пойму в чем дело.

Код:
var  q:^integer;
begin
  new(q);
  q^:=5;
  dispose(q);
  Label1.Caption:=inttostr(q^);
end;
Почему после высвобождения памяти остается значение переменной (в данном случае на экране будет 5)?

Последний раз редактировалось Stilet; 25.03.2010 в 08:06.
PaulSev вне форума Ответить с цитированием
Старый 25.03.2010, 06:47   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Почему Вы собственно решили что это проблема?
И в переменной остается не 5, а адрес ячейки где это число хранится. А это большая разница. Память высвобождается в том смысле, что ее можно использовать повторно, речь об инициализации выделенной памяти не идет. Освобожденный блок памяти считается свободным, но информацию оттуда надо удалять вручную (если надо).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 06:54   #3
PaulSev
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 5
По умолчанию

Получается что я очищаю динамическую переменную, а она остается. А потом может быть этот блок памяти может быть использован для других целей? И как я теперь должен избавиться от этой 5?

Будет ли высвобождена память в этом случае

Код:
new(q);
q^:=5;
q:=nil
или нужно написать так

Код:
new(q);
q^:=5;
s:=q;
q:=nil;
dispose(s);

Последний раз редактировалось Stilet; 25.03.2010 в 08:06.
PaulSev вне форума Ответить с цитированием
Старый 25.03.2010, 07:17   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от PaulSev Посмотреть сообщение
Получается что я очищаю динамическую переменную, а она остается. А потом может быть этот блок памяти может быть использован для других целей? И как я теперь должен избавиться от этой 5?
Вы ее не очищаете. Вы разрешаете использовать данный участок для других целей и все. Это значит, что если Вы выделите новый участок памяти, то есть вероятность, что это он же и окажется .
А зачем Вам избавляться от 5-ки? Можете сделать две вещи:
а) изменить указатель q:=nil;
б) изменить значение ячейки q^:=0; (до Dispose)
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 07:21   #5
PaulSev
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 5
По умолчанию

я должен избавиться от последнего элемента однонаправленного списка, как будет правильно
так

Код:
new(q);
q^:=5;
.....
q:=nil

или так

new(q);
q^:=5;
......
s:=q;
q:=nil;
dispose(s);

Последний раз редактировалось Stilet; 25.03.2010 в 08:06.
PaulSev вне форума Ответить с цитированием
Старый 25.03.2010, 07:38   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Первый вариант, ИМХО.

ЗЫ. Для всяких там списков и стеков я использую динамические массивы и никогда не парюсь с указателями . По сути тоже самое, но мне не надо следить за тем, кому и чего выделять и высвобождать. И главное правило при таких играх - перед использованием и высвобождением память всегда инициализируется (присваивается начальное значение, допустим нуль).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 25.03.2010 в 07:48.
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 08:12   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я должен избавиться от последнего элемента однонаправленного списка
Правильно будет обратить последний элемент в nil, (и обNILить в предпоследнем указатель на последний, если ты таковой пользуешь)
т.е. вариант Уткина №А
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.03.2010, 08:27   #8
PaulSev
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 5
По умолчанию

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

Код:
......
s:=q;
q:=nil;
dispose(s);
PaulSev вне форума Ответить с цитированием
Старый 25.03.2010, 08:31   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Закинь ты свой вариант с промежуточной переменной. Мне кажется ты уже давно решил для себя как поступишь, а не спрашиваешь совета.
Код:
var  q:^integer;
begin
  new(q);
  q^:=5;
  dispose(q);
  q:=nil;
  Label1.Caption:=inttostr(q^);
end;
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 08:47   #10
PaulSev
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 5
По умолчанию

Просто я хочу разобраться что все таки происходит в результате подобных действий в подробностях. Если бы мне просто нужно было решение я бы и не заморачивался. Мне нужно глубокое понимание данного вопроса.
PaulSev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическая память в си Serjuk Помощь студентам 0 27.12.2009 13:54
Динамическая память!!! Doholyan Паскаль, Turbo Pascal, PascalABC.NET 12 30.06.2009 17:11
динамическая память aka_faith Общие вопросы C/C++ 47 12.06.2009 12:35