Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

:=nil; Free; Destroy [D7, WinXP]


Страницы:   1 2

AndrewVolkov ©   (2004-07-07 01:03:00) 

Подскажите пожалуйста в чем основные различия применительно к объектам.

В каком члучае мы делаем дестрой, фри или можно просто присвоить значение нил.

И как это сказывается на памяти - в каком случае мы ее освобождаем а в каком нет?

Спасибо


Palladin   (2004-07-07 01:49:00) [21]


>  [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;


AndrewVolkov   (2004-07-07 01:43:00) [22]

Значит получается
Фри и Дестрой  - чистим, удаляем
нил - только удаляем?


GuAV   (2004-07-07 01:39:00) [23]


> коротким строкам такого эффекта не дает :)

А Nil им ваще не присвоишь без typecasta, AFAIR.


GuAV   (2004-07-07 01:37:00) [24]


> При Фри или Дестрой мы очищаем память, но не удаляем сам
> объект - так получается.

И сам объекттоже удаляем. А если надо еще и ссылкуна него обнулить, то FreeAndNil


Palladin   (2004-07-07 01:37:00) [25]

Это в скользь упомянуто было, чтоб человек был в курсе что длинные строки это тоже дин массивы... особенные... кстати присвоение '' коротким строкам такого эффекта не дает :) Сколько сожрано столько сожрано... на все время существования переменной к чему бы ее не присваивали...


AndrewVolkov   (2004-07-07 01:34:00) [26]

to Palladin

Сорри, но до конца мне так и не ясно.
При Фри или Дестрой мы очищаем память, но не удаляем сам объект - так получается. А нилом мы его дотираем из жизни. Или при фрии или дестрой все-таки происходит уничтожение объекта?


GuAV   (2004-07-07 01:32:00) [27]


> Для динамических массивов (и строк) присваивание Nil

Имхо, '' читабельнее.


Palladin   (2004-07-07 01:30:00) [28]


> Для Variant, OleVariant

Имеется ввиду те что заняты под CreateOleObject...


Palladin   (2004-07-07 01:29:00) [29]

Обнулим это значит присвоим переменной или 0 или Nil... и ничего более...
Если ранее была ссылка на объект или указатель под который выделена память произойдет утечка... перед этим нужно естественно освободить объект (Free) или память (Dispose,FreeMem и пр...)

Для динамических массивов (и строк) присваивание Nil уменьшает счетчик его использования, таком случае при полном обнулении счетчика, динамический массив освободится из памяти... в общем случаев это уменьшение счетчика происходит автоматически и волноватся особо не надо...

Для Variant, OleVariant и интерфейсов при присваивании Nil происходит тоже самое что и с динамическими массивами...


GuAV   (2004-07-07 01:25:00) [30]

это обнилим указатель - сделаем его указателем который никуда не указывает. а ваще на такие вопросы правильный ответ F1. просто только что тест проходил, уже машинально и на это ответил :) в тесте вар-та F1 не было :)


AndrewVolkov   (2004-07-07 01:21:00) [31]

то Guav

обнулим - это сотрем его из памяти или нет, я не совсем понял

Первый обнулит. Остальные освободят

обнулит, он не освободит память???


GuAV   (2004-07-07 01:15:00) [32]

Первый обнулит. Остальные освободят.

> В каком члучае мы делаем дестрой, фри или можно просто присвоить
> значение нил.

В общем случае см. выше и по контексту.

> И как это сказывается на памяти - в каком случае мы ее освобождаем
> а в каком нет?

2,3 - освобождаем.

зы а еще есть FreeAndNil


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо