Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1228841083
zheka
2008-12-09 19:44
2009.02.01
Scellam distribution


15-1227983453
NailMan
2008-11-29 21:30
2009.02.01
Какую-нибудь книжку по сварочному делу посоветуйте


2-1229515916
Nameziz
2008-12-17 15:11
2009.02.01
MouseMove


15-1228647249
Slider007
2008-12-07 13:54
2009.02.01
С днем рождения ! 6 декабря 2008 суббота


2-1229789252
self
2008-12-20 19:07
2009.02.01
ticqclient в dll





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