Форум: "Основная";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
ВнизПеременная и ее отчистка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c