Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-78273
maxim2
2002-10-01 12:26
2002.10.24
Как узнать сколько таблиц в базе если знаеш псевдоним базы


6-78570
SeVa :()
2002-08-16 05:28
2002.10.24
Подмена своего IP на диалапе


14-78614
QUE
2002-10-03 14:01
2002.10.24
Пропали компаненты


3-78301
feya
2002-10-03 19:40
2002.10.24
Как добавить данные в таблицу MSAccess


1-78386
dix mod
2002-10-15 09:28
2002.10.24
Двоичные деревья





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский