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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2010, 08:59   #11
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

new - выделение места, это значит что данная ячейка занята и не будет выделяться для других указателей (при этом предыдущее значение в памяти сохраняется!).
q^:=5; - присвоение ячейки памяти, адрес которой находится в q числа 5
dispose(q); - освобождение ячейки памяти. Это значит, что ее можно снова использовать для других целей (при этом ячейка не теряет своего значения - 5. q по-прежнему содержит адрес данной ячейки).
q:=nil; - сброс адреса в указателе. Указатель не на что не указывает (вернее указывает на недоступную область памяти)
Label1.Caption:=inttostr(q^); - попытка прочитать значение ячейки памяти по адресу находящемся в q. При это естественно будет ошибка, потому что указатель ссылается на недоступное место.

Мораль всей басни - где то в недрах компа по-прежнему живет ячейка имеющая значение 5. Но после q:=nil; найти Вы ее не сможете, если до этого не сохраняли адрес где-то еще (как Вы предлагаете это сделать с промежуточной переменой).
Чисто теоретически если Вы знаете что ищете, то смещая указатель можно найти эту область памяти (если она не будет затерта новым вызовом new, который может возникать кстати и без Вашего участия, например через SetLength(), или скажем, после модификации AnsiString).
Думаю объяснил понятней уже некуда.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 09:00   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
var  q:^integer;
begin
{ Выделяем память для целого числа, адрес ячейки выделенной памяти записывается в Q}
  new(q);
{Присваимаем в эту ячейку значение}
  q^:=5;
{Освобождаем память. Говорил Менеджеру распределения памяти что эта ячейка свободна. 
Менеджер запоминает ее, но при этом ничего из ячейки не стирается (не обнуляется), 
и сама q тоже не меняется никоим образом - т.е. менеджер памяти мусор за собой не убирает}
  dispose(q);
{именно поэтому следующая строка сработает}
  Label1.Caption:=inttostr(q^);
{Однако если бы после dispose(q) в программе стояло новое выделение памяти
 толи new толи GetMem был бы шанс что эта ячейка стала бы опять 
зарезервированной но уже для другой переменной}
end;
посему рекомендуется убирать за собой мусор, как Уткин показал
Причем я бы еще обнулил содержимое в самой ячейке, если это для меня так важно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.03.2010, 09:07   #13
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
т.е. менеджер памяти мусор за собой не убирает
Не за собой, а за программистом. С какой стати? Не он же мусорил и в его должностных инструкциях функции дворника не прописаны.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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