Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Вниз

Передача объекта как параметра..   Найти похожие ветки 

 
pathfinder ©   (2007-05-31 15:51) [0]

Здравствуйте.
Помогите, пожалуйста, разобраться.
Если мы передаем в процедуру в качестве параметра объект, то передается указатель на этот объект. А в чем разница если передавать объект как const, var или по значению?

И почему, если я передаю в метод а объект с и вызываю его метод free, то объект c не уничтожается?

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 public
   procedure a(var obj: tlist);
   procedure b();
 end;

procedure TForm1.a(var obj: tlist);
begin
 tlist(obj).Free;
end;

procedure TForm1.b;
var
 c: tlist;
begin
 c:=tlist.create;

 a(c);
end;


 
Плохиш ©   (2007-05-31 15:53) [1]


> если я передаю в метод а объект с и вызываю его метод free,
>  то объект c не уничтожается?

Уничтожается.

> procedure TForm1.a(var obj: tlist);
> begin
>  tlist(obj).Free;
> end;

"Масло масляное"?


 
pathfinder ©   (2007-05-31 15:55) [2]


> Плохиш ©   (31.05.07 15:53) [1]


ага)

если obj.free, то результат аналогичный..


 
Сергей М. ©   (2007-05-31 15:56) [3]


> И почему, если я передаю в метод а объект с и вызываю его
> метод free, то объект c не уничтожается?
>


Чегой-то вдруг ?


 
Плохиш ©   (2007-05-31 15:57) [4]


> pathfinder ©   (31.05.07 15:55) [2]

Как определил, что не уничтожается?


 
pathfinder ©   (2007-05-31 15:59) [5]


> Как определил, что не уничтожается?


посмотрел его свойство count..

procedure TForm1.a(var obj: tlist);
begin
 obj.Free;
end;

procedure TForm1.b;
var
 c: tlist;
begin
 c:=tlist.create;

 a(c);

 showmessage(inttostr(c.Count));
end;


 
pathfinder ©   (2007-05-31 16:01) [6]

вернулось значение 0.

а если

procedure TForm1.b;
var
c: tlist;
begin
c:=tlist.create;

a(c);

 c.free;

showmessage(inttostr(c.Count));
end;

то соответственно ошибка..


 
DiamondShark ©   (2007-05-31 16:01) [7]


> А в чем разница если передавать объект как const, var или
> по значению?

Передавать объект как const довольно бессмысленно, разве что нельзя будет поменять переменную-параметр, что само по себе малополезно.
Физически передача объекта как const не будет отличаться от передачи по значению.
Если передавать как var, то фактически будет передаваться указатель на указатель на объект.


> И почему, если я передаю в метод а объект с и вызываю его
> метод free, то объект c не уничтожается?

Уничтожается. Вызывается деструктор, финализируются поля объекта и занимаемая объектом память возвращается в свободную.

Откуда сделан вывод о неуничтожении?
Из того, что объектная переменная не меняется? Разумеется, значение объектной переменной (указателя) не меняется.
А может метод free переопределён?


 
DiamondShark ©   (2007-05-31 16:03) [8]


> pathfinder ©   (31.05.07 15:59) [5]
> pathfinder ©   (31.05.07 16:01) [6]

мама...
:(


 
pathfinder ©   (2007-05-31 16:05) [9]


> pathfinder ©   (31.05.07 16:01) [6]


Это конечно я погнал..

А как достоверно определить уничтожен объект или нет?


 
Плохиш ©   (2007-05-31 16:07) [10]


> pathfinder ©   (31.05.07 16:05) [9]
> А как достоверно определить уничтожен объект или нет?

А смысл? Кто прогер, ты или пушким?


 
McSimm_ ©   (2007-05-31 16:08) [11]


> А как достоверно определить уничтожен объект или нет?

Поместить ShowMessage в его деструктор :)


 
Джо ©   (2007-05-31 16:09) [12]

> [9] pathfinder ©   (31.05.07 16:05)

> А как достоверно определить уничтожен объект или нет?

Собственно, никак.
Если сам объект не предоставляет механизма уведомления об уничтожении, конечно.
Или если таковые действия специально не предпринять, например использовать FreeAndNil и проверить переменную на nil.
Но это все «косвенные», так сказать, способы :)


 
Плохиш ©   (2007-05-31 16:10) [13]


> Поместить ShowMessage в его деструктор :)

Лучше отсылку емайла кодеру :-)


 
DiamondShark ©   (2007-05-31 16:11) [14]


> А как достоверно определить уничтожен объект или нет?

В общем случае -- никак.
Только выстраивая логику программы таким образом, чтобы исключить обращение к удалённым объектам.
Например, при вызове некоторых (тем более собственноручно написных!) функций знать и помнить, что побочным эффектом является уничтожение переданного параметром объекта.



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

Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.079 c
4-1168441102
MonZon
2007-01-10 17:58
2007.06.24
Надо прочитать данные из COM-port.


1-1177671789
samael6
2007-04-27 15:03
2007.06.24
Использование ActiveX написанного на ВБ


4-1168961302
TProgrammer
2007-01-16 18:28
2007.06.24
Приоритет процессов


2-1180793466
Meriguan
2007-06-02 18:11
2007.06.24
ГРАБЕР текстов с сайта...


2-1180537474
[Salo] phantom
2007-05-30 19:04
2007.06.24
ООП





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