-
Procedure ddd; Var s:TStringList; Begin s:=TStringList.Create; Try Exit; Finally s.Free; End; End;
procedure TForm1.Button1Click(Sender: TObject); begin ddd; // ставим breakpoint и по F7 шагаем end;
у кого не D6, просьба посмотреть, выполнится s.Free или нет...
-
Даже и смотреть не надо - обязан получить управление. Мож ты по запарке смотришь не там где лежит, а там где светлее ?
-
из справки семерки Note: Exit passes control away from the current procedure, not merely the current block. But Exit does not violate the flow of control dictated by a try..finally construct; if Exit is called inside the try clause, the finally clause is still executed. поведение соответствует описанию
-
копнул глубже, и вот что получилось Function ddd(Const s:String;Var r:String):Boolean;
Var
ss:TStringList;
Begin
ss:=TStringList.Create;
Try
ss.add(s);
Result:=s='1';
If Result Then r:='2';
Finally
ss.Free;
End;
End;
Function GetDDD(Const s:String;Const def:String):String;
Begin
If Not ddd(s,Result) Then Result:=def;
End;
procedure TForm1.Button1Click(Sender: TObject);
Var
c:Integer;
begin
c:=AllocMemSize;
GetDDD('2222','14');
ShowMessage(IntToStr(AllocMemSize-c));
end;
как объяснить этот феномен? :)
-
> Palladin (14.11.2008 13:45:00) [0]
Зачем проверять, справка гарантирует выполнение ветки finally end
-
> Сергей М. © (14.11.08 13:51) [1] > ПРавильный$Вася (14.11.08 13:53) [2]
не прав я был, когда грешил на "фичу" Exit, по F7 если идти внутри функции, то заходит в Finally, если по F8 то прыгает сразу на ее End;
-
> Palladin (14.11.2008 13:56:05) [5]
Ты поведению отладчика особо не доверяй.
-
> Anatoly Podgoretsky © (14.11.08 13:58) [6]
да фик сним, с отладчиком, куда 12 байт деваются? :)
-
> Palladin (14.11.2008 14:02:07) [7]
Только меня не обвиняй.
-
> Palladin © (14.11.08 14:02) [7]
Плюнь на них. Они никуда не теряются. Это работа оптимизатора менеджера памяти.
потыкай дюжину-lheue. раз на это батон и понаблюдай:
procedure TForm1.Button3Click(Sender: TObject); var p: PInteger; begin showmessage(inttostr(allocmemsize)); getmem(p, 2000); freemem(p); showmessage(inttostr(allocmemsize)); end;
-
мда, действительно... спасибо, успокоил :)
-
> да фик сним, с отладчиком, куда 12 байт деваются? :)
Ша... никто таки никуда уже не девается :) У меня ноль кажет твоя функция :)
-
А разве выход из функции делается не в одном-единственном месте (это если посмотреть машкод) ?
-
> Rouse_ © (14.11.08 14:10) [11]
А у тебя и не D6! :)
Мля, как идиот ковырялся, искал то - чего нет :) И каждый раз разное количество "пропадало", в зависимости от исходных данных. Думал свихнусь :)
-
> Мля, как идиот ковырялся, искал то - чего нет :)
Трудно искать черную кошку в черной комнате, особенно, если ее там нет. (Место встречи изменить нельзя)
-
> MsGuns (14.11.2008 14:16:12) [12]
В отдном, но какое это отношение имеет к finally end?
-
ВТакое, что финалли будет отработано в ЛЮБОМ случае
-
в шестерке был такой косяк, потом поправили
-
> Мля, как идиот ковырялся, искал то - чего нет :) И каждый > раз разное количество "пропадало", в зависимости от исходных > данных. Думал свихнусь :)
А ты так попробуй ;) procedure Test();
begin
GetDDD('2222','14');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
c:Integer;
begin
c:=AllocMemSize;
Test();
ShowMessage(IntToStr(AllocMemSize-c));
end;
-
:) да нашел я эти 3, ушедших на резалт, первый строчка и второй строчка, указателя, сидевших до end для обработчика события :)
|