bool CExpr2Parser::Translate(char*expr)
{
CExprParser* builder;
try
{
translated=true;
builder=new CExprParser(expr,functions,variables,code);
}
catch(...)
{
translated=false;
variables->Clear();
code->Clear();
delete builder;
throw ;
}
delete builder;
varcount=variables->GetCount();
return translated;
}
Помогите разобраться с блоками try-catch
Код:
При возникновении исключения (т.е. в блоке catch) сначала удаляю экземпляр класса CExprParser, затем ретранслирую это исключение (чтобы на более высоком уровне его обработать). Так вот, при удалении экземпляра класса возникает ошибка Access Violation. В чем дело?
Исключение формируется в конструкторе, поэтому переменая builder не инициализируется. Поэтому не срабатывает и delete. Как можно правильно обработать исключение, возникшее в конструкторе при создании объекта, и правильно удалить этот объект?
Цитата:
Originally posted by shewa
ХЗ
ХЗ
Другие варианты ?
Цитата:
Originally posted by michael_is_98
Другие варианты ?
Другие варианты ?
Код:
bool CExpr2Parser::Translate(char*expr)
{
CExprParser* builder=0;
try
{
builder=new CExprParser(expr,functions,variables,code);
...
}
catch(...)
{
...
if(builder)
delete builder;
throw ;
}
....
if(builder)
delete builder;
return translated;
}
bool CExpr2Parser::Translate(char*expr)
{
auto_ptr<CExprParser> builder;
try
{
builder=auto_ptr<CExprParser>(new CExprParser(expr,functions,variables,code));
...
}
catch(...)
{
...
throw ;
}
....
return translated;
}
{
CExprParser* builder=0;
try
{
builder=new CExprParser(expr,functions,variables,code);
...
}
catch(...)
{
...
if(builder)
delete builder;
throw ;
}
....
if(builder)
delete builder;
return translated;
}
bool CExpr2Parser::Translate(char*expr)
{
auto_ptr<CExprParser> builder;
try
{
builder=auto_ptr<CExprParser>(new CExprParser(expr,functions,variables,code));
...
}
catch(...)
{
...
throw ;
}
....
return translated;
}
http://www.icce.rug.nl/documents/cplusplus/cplusplus08.html
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Exceptions.3a_.Exceptions_in_Constructors.asp
Код:
bool CExpr2Parser::Translate(char*expr)
{
try
{
translated=true;
CExprParser* builder;
builder=new CExprParser(expr,functions,variables,code);
delete builder;
}
catch(...)
{
translated=false;
variables->Clear();
code->Clear();
throw ;
}
varcount=variables->GetCount();
return translated;
}
{
try
{
translated=true;
CExprParser* builder;
builder=new CExprParser(expr,functions,variables,code);
delete builder;
}
catch(...)
{
translated=false;
variables->Clear();
code->Clear();
throw ;
}
varcount=variables->GetCount();
return translated;
}
По идеи, если указатель на объект класса размещен в try-catch и здесь же создается объект класса, то при возникновении исключ. объект должен автомат. удаляться.
В этом случае компилятор не позволит использовать переменную builder за пределами try-catch (выдает ошибку).