Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.24;
Скачать: CL | DM;

Вниз

Переменная и ее отчистка   Найти похожие ветки 

 
KidMan ©   (2002-10-10 22:13) [0]

Мастера!
Использовал переменную типа SmallInt и теперь мне нужно освободить память которую она занимает... Как это сделать?
может достаточно написать переменная := 0; ?

И еще... Метод free убивает обект а каким методом можно вновь его восстановить если вдруг понадобиться?

Заранее благодарю!


 
.   (2002-10-10 22:24) [1]

1)зачем?
2)например tfilestream - myfilestream := TFileStream.Create("blabla", $FFFF);


 
Юрий Зотов ©   (2002-10-10 22:39) [2]

1. Переменные бывают статические и динамические. Память для первых выделяет компилятор (и ее никак не освободить, потому они так и называются), а для вторых - мы сами (и поэтому ее можно освободить).

var
// Cтатическая переменная:
StaticVar: SmallInt;
// Cтатический указатель на динамическую переменную:
PDynamicVar: ^SmallInt;

...
New(PDynamicVar); // См. также GetMem
PDynamicVar^ := 5;
Dispose(PDynamicVar); // См. также FreeMem


2. В Delphi все объекты создаются в динамической памяти.
var
MyObj: TMyObject;
...
MyObj := TMyObject.Create;
// Теперь MyObj указывает на адрес объекта в памяти.

FreeMem освобождает память, которую занимал объект. Поэтому восстановить его уже нельзя никак, можно только создать новый (вызовом конструктора).

MyObj.Free;
// Теперь объекта уже не существует и, хотя содержимое переменной MyObj не изменилось, оно стало некорректным.

MyObj := TMyObject.Create;
// Теперь MyObj указывает на адрес НОВОГО объекта в памяти.


3. Примите добрый совет - отложите на время объекты и научитесь свободно работать с динамической памятью и указателями. Без понимания этих вещей в Delphi (да и не только в Delphi) ничего серьезного сделать практически нельзя, можете поверить.


 
evgeg ©   (2002-10-10 22:49) [3]

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


 
.   (2002-10-10 22:51) [4]

мой скромненький вопрос для чего есть freeandnil?


 
¤NoNaMe¤ ©   (2002-10-10 22:53) [5]

procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;

Из кода видно для чего...


 
.   (2002-10-10 23:26) [6]

¤NoNaMe¤ © (10.10.02 22:53)
>Из кода видно для чего...

видно ??? - рассказываю, что я вижу (по порядку) -
- в функцию передается нетипизированный указатель на что-то, (назову его внешним указателем)
- внутри функции определяется внутренняя переменная-указатель (на этот раз типизированный)
- выполняется присвоение локальной переменной значения внешнего указателя (с приведением типа)
- далее выполняется обнИление внешнего указателя (опять же с приведением типа)
- ну и финальный аккорд - вызов метода Фри для внутреннего указателя

А теперь вопросы:
- зачем производится резервирование значения параметра в дополнительной внутренней переменной ???
- зачем нужны все эти хитрые преобразования типов, а ???
- почему нельзя сделать так

procedure FreeAndNil(var Obj);
begin
TObject(Obj).Free;
Obj:= Nil;
end;

???


 
.   (2002-10-10 23:37) [7]

не бери мой ник =)


 
Dr_Mike ©   (2002-10-10 23:40) [8]

Сорри, случайно вышло (хотя вообще-то надо регистрироваться на форуме, если уж ником дорожишь)


 
Алексей Ким ©   (2002-10-10 23:43) [9]

да не очень я дорожу =) кому он нужен...


 
KidMan ©   (2002-10-12 00:31) [10]

Спасибо всем!



Страницы: 1 вся ветка

Текущий архив: 2002.10.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
14-78662
Nox
2002-10-04 18:24
2002.10.24
Дельфи - это сила


3-78232
kalliopiy
2002-10-01 16:48
2002.10.24
Файлы и БД


3-78226
Nayfl
2002-10-01 05:55
2002.10.24
Password


14-78597
Карлсон
2002-10-01 21:37
2002.10.24
мужики, и дамы тоже....


3-78276
Борис
2002-09-28 14:02
2002.10.24
Появляются файлы _qsq1.db и так далее в корне