Форум: "Начинающим";
Текущий архив: 2009.02.01;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c