Форум: "Начинающим";
Текущий архив: 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.038 c