![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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