Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Вниз:=nil; Free; Destroy Найти похожие ветки
← →
AndrewVolkov © (2004-07-07 01:03) [0]Подскажите пожалуйста в чем основные различия применительно к объектам.
В каком члучае мы делаем дестрой, фри или можно просто присвоить значение нил.
И как это сказывается на памяти - в каком случае мы ее освобождаем а в каком нет?
Спасибо
← →
GuAV © (2004-07-07 01:15) [1]Первый обнулит. Остальные освободят.
> В каком члучае мы делаем дестрой, фри или можно просто присвоить
> значение нил.
В общем случае см. выше и по контексту.
> И как это сказывается на памяти - в каком случае мы ее освобождаем
> а в каком нет?
2,3 - освобождаем.
зы а еще есть FreeAndNil
← →
AndrewVolkov © (2004-07-07 01:21) [2]то Guav
обнулим - это сотрем его из памяти или нет, я не совсем понял
Первый обнулит. Остальные освободят
обнулит, он не освободит память???
← →
GuAV © (2004-07-07 01:25) [3]это обнилим указатель - сделаем его указателем который никуда не указывает. а ваще на такие вопросы правильный ответ F1. просто только что тест проходил, уже машинально и на это ответил :) в тесте вар-та F1 не было :)
← →
Palladin © (2004-07-07 01:29) [4]Обнулим это значит присвоим переменной или 0 или Nil... и ничего более...
Если ранее была ссылка на объект или указатель под который выделена память произойдет утечка... перед этим нужно естественно освободить объект (Free) или память (Dispose,FreeMem и пр...)
Для динамических массивов (и строк) присваивание Nil уменьшает счетчик его использования, таком случае при полном обнулении счетчика, динамический массив освободится из памяти... в общем случаев это уменьшение счетчика происходит автоматически и волноватся особо не надо...
Для Variant, OleVariant и интерфейсов при присваивании Nil происходит тоже самое что и с динамическими массивами...
← →
Palladin © (2004-07-07 01:30) [5]
> Для Variant, OleVariant
Имеется ввиду те что заняты под CreateOleObject...
← →
GuAV © (2004-07-07 01:32) [6]
> Для динамических массивов (и строк) присваивание Nil
Имхо, "" читабельнее.
← →
AndrewVolkov © (2004-07-07 01:34) [7]to Palladin
Сорри, но до конца мне так и не ясно.
При Фри или Дестрой мы очищаем память, но не удаляем сам объект - так получается. А нилом мы его дотираем из жизни. Или при фрии или дестрой все-таки происходит уничтожение объекта?
← →
Palladin © (2004-07-07 01:37) [8]Это в скользь упомянуто было, чтоб человек был в курсе что длинные строки это тоже дин массивы... особенные... кстати присвоение "" коротким строкам такого эффекта не дает :) Сколько сожрано столько сожрано... на все время существования переменной к чему бы ее не присваивали...
← →
GuAV © (2004-07-07 01:37) [9]
> При Фри или Дестрой мы очищаем память, но не удаляем сам
> объект - так получается.
И сам объект тоже удаляем. А если надо еще и ссылку на него обнулить, то FreeAndNil
← →
GuAV © (2004-07-07 01:39) [10]
> коротким строкам такого эффекта не дает :)
А Nil им ваще не присвоишь без typecasta, AFAIR.
← →
AndrewVolkov © (2004-07-07 01:43) [11]Значит получается
Фри и Дестрой - чистим, удаляем
нил - только удаляем?
← →
Palladin © (2004-07-07 01:49) [12]
> [7] AndrewVolkov © (07.07.04 01:34)
Есть понятие созданный объект... а созданный объект это не только выделенная память под значения его полей... нужно учитывать что поля объекта могут быть тоже объектами... задача конструктора проинициализировать все поля (создать агрегированные объекты, выделеть память для указателей например)... задача декструктора все это освободить...
TSimpleClass=Class
Private
CrazyField:Pointer;
Public
Constructor Create;
Destructor Destroy; Override;
End;
Constructor TSimpleClass.Create;
Begin
GetMem(CrazyField,<многомного>);
End;
Destructor TSimpleClass.Destroy;
Begin
Inherited;
FreeMem(CrazyField);
End;
Var
SimpleObject:TSimpleClass;
...
SimpleObject:=TSimpleClass.Create; // объект создался память под поле CrazyField взята, значение идентификатора SimpleObject=5555555 - адрес размещенного объекта в памяти
...
если сделать простоSimpleObject:=Nil
идентификатора SimpleObject просто станет равным нулю, а еще точнее значению ассоциированному с Nil... деструктор не вызвался, сам SimpleObject остался в памяти и ссылка на него утеряна... нам ее не вернуть, если мы конечно ее не сохраняли в другом идентификаторе... и память под CrazyField утекла...
если же сделать простоSimpleObject.Free
без присвоения Nil, вступает в свои права человеческий фактор в применении к программисту, будет не возможно определить при повторном использовании идентификатора для создания объекта, был ли уничтожен прошлый... поэтому настоятельно рекомендую взять на вооружение подобные скобки создания объекта
Assert(SimpleObject=Nil,"Возможна утечка памяти "SimpleObject"");
SimpleObject:=TSimpleObject.Create;
Try
...
Finally
FreeAndNil(SimpleObject);
ну или
SimpleObject.Free;
SimpleObject:=Nil;
End;
← →
GuAV © (2004-07-07 01:49) [13]
> Фри и Дестрой - чистим, удаляем
да.
> нил - только удаляем?
нет, и не удаляем.
Понимаешь, в переменной хранистя ссылка. Четыре байта. Сам класс - в "куче". И кстати это про классы а не про объекты. Объекты - это наследство Паскаля и у них Фри и Дестрой - нет заранее заданного - как объявишь так и будет. И давай уже RTFM Object Pascal Reference.
← →
Palladin © (2004-07-07 01:51) [14]заболтался...
Assert(SimpleObject<>Nil,"Возможна утечка памяти "SimpleObject"");
← →
AndrewVolkov © (2004-07-07 01:53) [15]Большое спасибо.
После последних двух топиков - ясно все как ясный день
Еще раз премного благодарен...
← →
Palladin © (2004-07-07 01:54) [16]
> [10] GuAV © (07.07.04 01:39)
нет... я про присвоение им "" ...
← →
GuAV © (2004-07-07 01:56) [17]
> Assert(SimpleObject=Nil,"Возможна утечка памяти "SimpleObject"");
> SimpleObject:=TSimpleObject.Create;
> Try
> ...
> Finally
> FreeAndNil(SimpleObject);
> ну или
> SimpleObject.Free;
> SimpleObject:=Nil;
> End;
Это если ссылка на экземпляр класса - глобальная переменная или поле другого объекта. для локальных:
для локальных Ctrl+J->trycf
← →
GuAV © (2004-07-07 02:00) [18]
> нет... я про присвоение им ""
Я так и понял.
← →
AndrewVolkov © (2004-07-07 02:00) [19]
Ctrl+J->trycf
что это?
и что делает Assert?
← →
Palladin © (2004-07-07 02:03) [20]Ситуация с локальными...
Procedure SOC1(Var rp_oSOC:TSOC);
Begin
SO:TSO.Create;
...
забыли освободить
End;
Procedure SOC2;
Var
SO:TSO;
Begin
SO:TSO.Create;
...
if надо получить другой
begin
забыли освободить...
SOC1(SO);
end;
забыли освободить...
End;
это сильно упрощенная модель, с виртуальными конструкторами такое очень может произойти в более сложном варианте...
← →
Palladin © (2004-07-07 02:04) [21]
> [19] AndrewVolkov © (07.07.04 02:00)
А про Assert достаточно просто описано в справке...
← →
jack128 © (2004-07-07 02:06) [22]
> Ctrl+J->trycf
> что это?
это нужно делать в обратном порядке. Сначала набираешь в редакторе trycf , а потом нажимаешь Ctrl + J
← →
GuAV © (2004-07-07 02:10) [23]
> это нужно делать в обратном порядке. Сначала набираешь в
> редакторе trycf , а потом нажимаешь Ctrl + J
не знал.. раньше всегда сначала ctrl+J а потом искал. отныне буду. крутеем :)
← →
GuAV © (2004-07-07 02:12) [24]
> Ситуация с локальными...
ну если уж очень хотите страховаться, то оставьте ваш код, но в самом начале дописать :=nil
← →
AndrewVolkov © (2004-07-07 02:14) [25]то jack128 спасибо
такая рульная штучка оказалась Ctrl+J. Экономия времени и такое удобство.
А про Аssert я толком не въехал. Моего английского по Ф1 явно не хватило....;-(
← →
GuAV © (2004-07-07 02:25) [26]Assert поднимет исключение EAssertionFailed при ложности условия. Тескт сообщения об ошибки - второй параметр.
> Экономия времени и такое удобство.
А ещё есть Ctrl+KI/Ctrl+KU, Ctrl+Shift+C и еще мого его. IDE дельфи вся рульная.
← →
AndrewVolkov © (2004-07-07 02:30) [27]Блин, у меня сегодня какой-то день открытий.
Ассерт - тоже оказался забойной штучкой.
Ctrl+KI/Ctrl+KU
что нажимать - одновременно K i I?
Ctrl+Shift+C никакой реакции.
← →
wnew © (2004-07-07 03:56) [28]
> AndrewVolkov © (07.07.04 02:30) [27]
> Блин, у меня сегодня какой-то день открытий.
> Ассерт - тоже оказался забойной штучкой.
>
> Ctrl+KI/Ctrl+KU
> что нажимать - одновременно K i I?
> Ctrl+Shift+C никакой реакции.
Объявляешь процедуру или функцию в классе в интерфейсной части, ставишь на неё курсор и нажимаешь Ctrl+Shift+C, в результате в части implementation появится готовая заготовка этой процедуры или функции.
Ctrl+KI/Ctrl+KU для перемещения выделенного блока текста вправо и соответственно влево. К примеру, при нажатой ALT мышью выделяешь часть текста (выделение в этом случае не построчное, а прямоугольное), после чего удерживаешь нажатой Ctrl и одновременно нажимаешь K, затем отпускаешь обе клавиши и нажимаешь I или U. В результете выделенный блок будет смещён вправо или влево на величину табуляции.
← →
evvcom © (2004-07-07 10:13) [29]
> такая рульная штучка оказалась Ctrl+J.
А еще этот список можно редактировать: Tools > Editor Options... > Source Options > Edit Code Templates... - это для D7. В D5 было немного по другому, но тоже было.
← →
AndrewVolkov © (2004-07-07 20:29) [30]Всем огроменное спасибо.
Обычно сдвигание занимало много времени, а все оказалось так просто и удобно.
и Ctrl+Shift+C. Столько удобных вещей оказывается есть, которые качественно могут съэкономить время...
← →
Amoeba © (2004-07-08 11:56) [31]
> AndrewVolkov © (07.07.04 20:29) [30]
Видишь, насколько необходимо и полезно учить матчасть.
← →
AndrewVolkov © (2004-07-08 19:46) [32]to Amoeba
никогда с этим и не спорил. Поэтому время от времени кидаю здесь вопросы и получаю очень качественные ответы...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.037 c