Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.01;
Скачать: CL | DM;

Вниз

initialization и finalization   Найти похожие ветки 

 
Saidamin   (2008-12-15 23:04) [0]

Ситуация:
в неосновном Unite в раделе initialization в массиве обьектов создаю сами обьекты. Работает всё замечательно, но в конце когда нужно очистить обьекты (радел finalization) программа видаёт ошибку. Дебаггер показивает что обьект опустой, хотя в программе нигде не удаляю.

Помогите!!! В чём ошибка?

initialization
 for ai := 0 to 5 do
 begin
    aIn[ai] := TGeoPoint.Create;
    aOut[ai] := TGeoPoint.Create;
 end;

finalization
 for ai := 0 to 5 do
 begin
    FreeAndNil(aIn[ai]);
    FreeAndNil(aOut[ai]);
 end;

end.


 
KilkennyCat ©   (2008-12-15 23:23) [1]


> неосновном Unite


 
Поросенок Винни-Пух ©   (2008-12-15 23:32) [2]

если экземплры нигде не освобождаются, то значит освобождается массив


 
Darvin   (2008-12-16 11:11) [3]

Я всегда делаю так:

initialization
for ai := 0 to 5 do
begin
   if aIn[ai] = nil then
     aIn[ai] := TGeoPoint.Create;
   if aOut[ai] = nil then
     aOut[ai] := TGeoPoint.Create;
end;

finalization
for ai := 0 to 5 do
begin
   if aIn[ai] <> nil then
     FreeAndNil(aIn[ai]);
   if aOut[ai] <> nil then
     FreeAndNil(aOut[ai]);
end;

end.


 
Ega23 ©   (2008-12-16 11:18) [4]


хотя в программе нигде не удаляю.


Уверен? Вставь в деструкторе TGeoPoint отпись в лог, что, мол, вызван деструктор.


 
Amoeba ©   (2008-12-16 11:24) [5]


> Darvin   (16.12.08 11:11) [3]
>
> Я всегда делаю так:
>
> initialization
> for ai := 0 to 5 do
> begin
>    if aIn[ai] = nil then
>      aIn[ai] := TGeoPoint.Create;
>    if aOut[ai] = nil then
>      aOut[ai] := TGeoPoint.Create;
> end;
>
> finalization
> for ai := 0 to 5 do
> begin
>    if aIn[ai] <> nil then
>      FreeAndNil(aIn[ai]);
>    if aOut[ai] <> nil then
>      FreeAndNil(aOut[ai]);
> end;
>
> end.


Не хило!

1. Initialization. Массив aIn  ведь до этого момента не затрагивался? Тогда зачем бессмысленная проверка на nil? Все его элементы и так по умолчанию пустые. Или он может заполняться и в Initialization других модулей?

2. Finalization. Проверка на на nil перед вызовом FreeAndNil имеет смысл лишь в том случае, если в основном коде объекты из массива тоже освобождаются обязательно вызовом FreeAndNil. Иначе - кирдык!


 
Darvin   (2008-12-16 11:29) [6]

> Amoeba ©
Клиент пишет, что НИГДЕ не освобождает его принудительно...


 
Ega23 ©   (2008-12-16 11:31) [7]


> Клиент пишет, что НИГДЕ не освобождает его принудительно.


Клиент думает, что НИГДЕ не освобождает его принудительно.


 
Amoeba ©   (2008-12-16 11:31) [8]


> Darvin   (16.12.08 11:29) [6]
>
> > Amoeba ©
> Клиент пишет, что НИГДЕ не освобождает его принудительно.
> ..
>

В таком случае нафига сдались эти ненужные телодвижения: if aIn[ai] <> nil then?


 
Ega23 ©   (2008-12-16 11:42) [9]


> В таком случае нафига сдались эти ненужные телодвижения:
>  if aIn[ai] <> nil then?


Нафиг они вообще в случае Free нужны, вот в чём вопрос.


 
Darvin   (2008-12-16 11:51) [10]

проверка на nil перед освобождением вообще-то считается хорошим стилем...


 
Amoeba ©   (2008-12-16 11:55) [11]


> Darvin   (16.12.08 11:51) [10]
>
> проверка на nil перед освобождением вообще-то считается
> хорошим стилем...

Только при строгом соблюдении одного условия - если указатель после освобождения всегда принудительно устанавливается в nil. Иначе, что совой о пень, что пнем о сову.


 
Ega23 ©   (2008-12-16 11:57) [12]


> проверка на nil перед освобождением вообще-то считается
> хорошим стилем...


procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;


 
tesseract ©   (2008-12-16 12:08) [13]


> если указатель после освобождения всегда принудительно устанавливается
> в nil.


У него так и стоит FreeAndNil, так что всё норм.


 
Ega23 ©   (2008-12-16 12:14) [14]


> У него так и стоит FreeAndNil, так что всё норм.


Да, но вот оно у него стоит:
1. В финализации.
2. Если кто-то где-то как-то данный объект убъёт, то ссылка на него один хрен в массиве останется. И там уже проверяй - не проверяй - AV.

А убить объект, явным образом не вызывая его деструктор - как два байта переслать. В TObjectList c OwnsObjects=true засунуть, например.


 
Игорь Шевченко ©   (2008-12-16 12:16) [15]


> проверка на nil перед освобождением вообще-то считается
> хорошим стилем...


проверка на nil перед Free считается показателем незнания средства разработки


 
Медвежонок Пятачок ©   (2008-12-16 15:50) [16]

да массив у него к моменту финализации уже мертв.



Страницы: 1 вся ветка

Текущий архив: 2009.02.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
6-1197549758
mary
2007-12-13 15:42
2009.02.01
idtcpclient


2-1229451823
smartleds
2008-12-16 21:23
2009.02.01
Еще вопрос, у меня долго прорисовывается форма


15-1228473709
GanibalLector
2008-12-05 13:41
2009.02.01
работа с девайсом по GPRS. Как ???


2-1229403281
Съедобный
2008-12-16 07:54
2009.02.01
добавление записи в БД


2-1229802885
sokol
2008-12-20 22:54
2009.02.01
подскажите мою ошибку. программа считает кол-во слов в тексте