Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
6-1165135971
B@rm@ley
2006-12-03 11:52
2007.06.24
все ip сети


3-1175167503
nick_van_rijn
2007-03-29 15:25
2007.06.24
ошибка начала транзакции


15-1180094735
Anatoly Podgoretsky
2007-05-25 16:05
2007.06.24
Дмитрий О.


15-1180338322
Капибара из дома
2007-05-28 11:45
2007.06.24
История про рогалики


15-1180507155
Jeer
2007-05-30 10:39
2007.06.24
Занятное поведение при наследовании