Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача объекта как параметра..


pathfinder ©   (2007-05-31 15:51:00) 

Здравствуйте.
Помогите, пожалуйста, разобраться.
Если мы передаем в процедуру в качестве параметра объект, то передается указатель на этот объект. А в чем разница если передавать объект как 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;


DiamondShark   (2007-05-31 16:11:00) [1]


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

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


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


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

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


Джо   (2007-05-31 16:09:00) [3]

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

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

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


McSimm_   (2007-05-31 16:08:00) [4]


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

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


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


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

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


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


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


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

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


DiamondShark   (2007-05-31 16:03:00) [7]


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

мама...
:(


pathfinder   (2007-05-31 16:01:00) [8]

вернулось значение 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:00) [9]


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

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


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

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

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


pathfinder   (2007-05-31 15:59:00) [10]


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


посмотрел его свойство 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;


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


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

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


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


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


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


pathfinder   (2007-05-31 15:55:00) [13]


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


ага)

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


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


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

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо