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

Вниз

Exit внутри Try/Finally   Найти похожие ветки 

 
Palladin ©   (2008-11-14 13:45) [0]

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 или нет...


 
Сергей М. ©   (2008-11-14 13:51) [1]

Даже и смотреть не надо - обязан получить управление.
Мож ты по запарке смотришь не там где лежит, а там где светлее ?


 
ПРавильный$Вася   (2008-11-14 13:53) [2]

из справки семерки
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.
поведение соответствует описанию


 
Palladin ©   (2008-11-14 13:55) [3]

копнул глубже, и вот что получилось

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;


как объяснить этот феномен? :)


 
Anatoly Podgoretsky ©   (2008-11-14 13:55) [4]

> Palladin  (14.11.2008 13:45:00)  [0]

Зачем проверять, справка гарантирует выполнение ветки finally  end


 
Palladin ©   (2008-11-14 13:56) [5]


> Сергей М. ©   (14.11.08 13:51) [1]
> ПРавильный$Вася   (14.11.08 13:53) [2]

не прав я был, когда грешил на "фичу" Exit, по F7 если идти внутри функции, то заходит в Finally, если по F8 то прыгает сразу на ее End;


 
Anatoly Podgoretsky ©   (2008-11-14 13:58) [6]

> Palladin  (14.11.2008 13:56:05)  [5]

Ты поведению отладчика особо не доверяй.


 
Palladin ©   (2008-11-14 14:02) [7]


> Anatoly Podgoretsky ©   (14.11.08 13:58) [6]

да фик сним, с отладчиком, куда 12 байт деваются? :)


 
Anatoly Podgoretsky ©   (2008-11-14 14:06) [8]

> Palladin  (14.11.2008 14:02:07)  [7]

Только меня не обвиняй.


 
Сергей М. ©   (2008-11-14 14:07) [9]


> 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;


 
Palladin ©   (2008-11-14 14:10) [10]

мда, действительно... спасибо, успокоил :)


 
Rouse_ ©   (2008-11-14 14:10) [11]


> да фик сним, с отладчиком, куда 12 байт деваются? :)

Ша... никто таки никуда уже не девается :) У меня ноль кажет твоя функция :)


 
MsGuns ©   (2008-11-14 14:16) [12]

А разве выход из функции делается не в одном-единственном месте (это если посмотреть машкод)
?


 
Palladin ©   (2008-11-14 14:17) [13]


> Rouse_ ©   (14.11.08 14:10) [11]

А у тебя и не D6! :)

Мля, как идиот ковырялся, искал то - чего нет :) И каждый раз разное количество "пропадало", в зависимости от исходных данных. Думал свихнусь :)


 
oxffff ©   (2008-11-14 14:19) [14]


> Мля, как идиот ковырялся, искал то - чего нет :)


Трудно искать черную кошку в черной комнате, особенно, если ее там нет.
(Место встречи изменить нельзя)


 
Anatoly Podgoretsky ©   (2008-11-14 14:21) [15]

> MsGuns  (14.11.2008 14:16:12)  [12]

В отдном, но какое это отношение имеет к finally end?


 
MsGuns ©   (2008-11-14 14:25) [16]

ВТакое, что финалли будет отработано в ЛЮБОМ случае


 
Ганя   (2008-11-14 15:23) [17]

в шестерке был такой косяк, потом поправили


 
Mystic ©   (2008-11-14 19:51) [18]


> Мля, как идиот ковырялся, искал то - чего нет :) И каждый
> раз разное количество "пропадало", в зависимости от исходных
> данных. Думал свихнусь :)


А ты так попробуй ;)

procedure Test();
begin
 GetDDD("2222","14");
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 c:Integer;
begin
 c:=AllocMemSize;
 Test();
 ShowMessage(IntToStr(AllocMemSize-c));
end;


 
Palladin ©   (2008-11-14 20:21) [19]

:) да нашел я эти 3, ушедших на резалт, первый строчка и второй строчка, указателя, сидевших до end для обработчика события :)


 
Mystic ©   (2008-11-14 20:59) [20]

Честно говоря я тоже какое-то время ломал себе голову над тем, откуда там утечка, но по другой причине. В коде строкам в программе присваиваются литеральные значения (за исключением экземпляра типа TStringList, но он уже к нужному моменту уничтожается). Следовательно все переменные типа string должны указывать на образ файла, и RefCount = $FFFFFFFF. Однако оказалось, что при вызове @LStrAsg все-таки происходит динамическое выделение памяти, даже если source литеральная строка. Впрочем понятный коментарий в этой функции объясняет и причину, по которой так сделано: чтобы исключить AV в случае динамической выгрузки пакета и/или DLL. С другой стороны осталось загадкой, почему компилятор поставил на операторе Result := def вызов @LStrAsg, а не @LStrLAsg, ведь Result это не глобальная переменная...


 
Mystic ©   (2008-11-14 21:22) [21]

Впрочем и это понятно :) Поскольку в операторе используется Result, и фиг его знает, какой переменной будет присвоено значение функции (глобальной или локальной), то закладываться надо на самый худший вариант.


 
Palladin ©   (2008-11-14 22:28) [22]


> Впрочем и это понятно :)

ага, уже потом.. )))



Страницы: 1 вся ветка

Текущий архив: 2009.01.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
4-1204156605
MikeZ
2008-02-28 02:56
2009.01.11
Запуск приложения из-под сервиса


2-1227704598
nachinayuschij
2008-11-26 16:03
2009.01.11
TPopupMenu


3-1212508441
Flyman
2008-06-03 19:54
2009.01.11
Как сделать поиск в базе данных в Юникоде


2-1227775852
vegarulez
2008-11-27 11:50
2009.01.11
Вопрос про ZeosDBO. (Zquery.Fields[i].AsDatetime);


15-1226891927
KSergey
2008-11-17 06:18
2009.01.11
Глупый вопрос: сравнение double