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

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

initialization и finalization [D7]


Saidamin ©   (2008-12-15 23:04:00) 

Ситуация:
в неосновном 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.


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

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


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


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


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


Ega23   (2008-12-16 12:14:00) [3]


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


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

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


tesseract   (2008-12-16 12:08:00) [4]


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


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


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


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


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


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


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

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


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

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


Ega23   (2008-12-16 11:42:00) [8]


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


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


Ega23   (2008-12-16 11:31:00) [9]


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


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


Amoeba   (2008-12-16 11:31:00) [10]


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

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


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

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


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


> 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. Иначе - кирдык!


Ega23   (2008-12-16 11:18:00) [13]


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


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


Darvin   (2008-12-16 11:11:00) [14]

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

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.


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

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


KilkennyCat   (2008-12-15 23:23:00) [16]


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


Наверх

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