Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1088485681
1
2004-06-29 09:08
2004.07.25
Каскадные изменения


1-1089795574
din
2004-07-14 12:59
2004.07.25
Подскажите пожалуйста какие нужны библиотеки


3-1088667324
N&amp;N
2004-07-01 11:35
2004.07.25
Вставка данных в базу


6-1085612967
Viner
2004-05-27 03:09
2004.07.25
Проверка почты


4-1086602471
Тимохов
2004-06-07 14:01
2004.07.25
Двусторонняя печать.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский