try{}__finally{}
если я напишу такой код
code:
[COLOR=blue]
code:
try
{
//somecode
if(MyIf)
return;
}
__finally
{
//finallycode
}
return;
[/COLOR]
то при выполнении условия MyIf будет ли исполнен код finallycode
Такой вопрос.
если я напишу такой код
code:
[COLOR=blue]
code:
try
{
//somecode
if(MyIf)
return;
}
__finally
{
//finallycode
}
return;
[/COLOR]
то при выполнении условия MyIf будет ли исполнен код finallycode
Насколько я С++ помню код заключенный в __finally исполняется в любом случае.А добавлен данный спецификатор для того чтобы не очишать память в нескольких местах.(То есть если у тя вылет по Эксцепшину то надо память чистить и в catch, а если нет Эксцепшина то просто в коде).
Такой вопрос.
если я напишу такой код
code:
[COLOR=blue]
code:
try
{
//somecode
if(MyIf)
return;
}
__finally
{
//finallycode
}
return;
[/COLOR]
то при выполнении условия MyIf будет ли исполнен код finallycode
приветствую
код не выполнится, return все таки
просто выйдешь из функции и все на этом
Насколько я С++ помню код заключенный в __finally исполняется в любом случае.А добавлен данный спецификатор для того чтобы не очишать память в нескольких местах.(То есть если у тя вылет по Эксцепшину то надо память чистить и в catch, а если нет Эксцепшина то просто в коде).
try
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}
а что если проверить, господа хацкеры, или у вас интернет работает быстрее чем компиллятор.
Код выполнятется, и выводится оба сообщения
------
с уважением
try
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}
а что если проверить, господа хацкеры, или у вас интернет работает быстрее чем компиллятор.
Код выполнятется, и выводится оба сообщения
------
с уважением
тогда это нарушает основные принципы С
return -- выход из функции в любом случае
как по мне это некоректно
тогда это нарушает основные принципы С
return -- выход из функции в любом случае
как по мне это некоректно
Если о принципах С, то
if(MyIf);
return;
-это выход в любом случае, а
if(MyIf)
return;
- это выход не в любом случае.
А "корректность" в данном случае я бы назвал "читабельностью", которая здесь, на мой взгляд, ни чуть не хуже, чем при использовании break.
тогда это нарушает основные принципы С
return -- выход из функции в любом случае
как по мне это некоректно
в принципе return это и есть выход в любом случае, а __finally можно рассматривать как ту самую точку выхода из функции, просто раньше мы ее не видели. Если рассмаривать ассемблерный код то на месте выхода из функции стоят разные инструкции по очистке памяти, и все такое, их вставляет туда компиллятор. А __finally просто даетя нам возможность добавить на это место свой код. Так что вряд ли это некорректоность, скорее риближение к истокам ;-)
Если о принципах С, то
if(MyIf);
return;
-это выход в любом случае, а
if(MyIf)
return;
- это выход не в любом случае.
А "корректность" в данном случае я бы назвал "читабельностью", которая здесь, на мой взгляд, ни чуть не хуже, чем при использовании break.
я имел виду вообщем
к примеру такой случай:
я ставлю return если хочу выйти из функции, игнорируя весь код после нее.
я хочу чтоб __finally в одном случае выполнялся, а в другом нет.
а здесь получается, что старый привычный способ выхода из функции фиг поможет
этот фича очень некоректна
здесь дядя Борланд очень не прав
я имел виду вообщем
к примеру такой случай:
я ставлю return если хочу выйти из функции, игнорируя весь код после нее.
я хочу чтоб __finally в одном случае выполнялся, а в другом нет.
а здесь получается, что старый привычный способ выхода из функции фиг поможет
этот фича очень некоректна
здесь дядя Борланд очень не прав
Интересный ты какой.Я хочу чтоб __finally в одном случае выполнялся, а в другом нет.
Понимаешь в чем дело __finally В любом случае выполняется, для того и придуман был. Это никак не нарушает структуру языка. Вопросу и претензии к Ритчи, Страуструпу и ANSI.
далее пробуем такой код:
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}
MessageBox(NULL, "after __finally", "", 0);
кто нить третий MessageBox видел?
Я НЕТ
пробуем такой код:
{
MessageBox(NULL, "try", "", 0);
return;
}
__finally
{
MessageBox(NULL, "__finally", "", 0);
}
MessageBox(NULL, "after __finally", "", 0);
кто нить третий MessageBox видел?
Я НЕТ
интересно, а вот если return убрать, то третье сообщение видно!
все-таки __finally это не совсем точка выхода из функции, раз он используется только с try, то может это что-то вроде catch, который отлавливает return из try, выполянет код и выбрасывается из функции, а если return не было, просто выполняется как обычный код и не выбрасывается
...замудренная штука
...замудренная штука
Я ничего замудренного не вижу
просто нужно внимательно читать
Перевожу на русский
кототорые должны быть призведены вне зависимости
от того как произошел выход из предшевствующего блока __try.
я думаю что если дизассемблировать то такой блок то мы скорее всего увидим что он выделен в качестве функции и то что находится в точке
выхода это и есть __finally