Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.014 c
2-1180439008
Sasha Sanches
2007-05-29 15:43
2007.06.24
Аппраксимация...


2-1180688001
Fly____
2007-06-01 12:53
2007.06.24
Нет ли у кого функции получения кода цвета из строки?


2-1180683587
kyn66
2007-06-01 11:39
2007.06.24
Тип "дата" в записи


8-1160066944
Tab
2006-10-05 20:49
2007.06.24
Рисование на Image с использованием GDI+


2-1180530887
navinavi
2007-05-30 17:14
2007.06.24
как узнать имя активного процесса




   Наверх