Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите разобраться с блоками try-catch

284
11 июля 2005 года
michael_is_98
587 / / 25.02.2005
У меня следующая ситуация: есть два класса CExpr2Parser и CExprParser, первый содержит в качестве своего члена указатель на второй класс, причем второй класс может генерировать исключения (с помощью throw). У первого класс есть метод Translate:
Код:
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;
}

При возникновении исключения (т.е. в блоке catch) сначала удаляю экземпляр класса CExprParser, затем ретранслирую это исключение (чтобы на более высоком уровне его обработать). Так вот, при удалении экземпляра класса возникает ошибка Access Violation. В чем дело?

Исключение формируется в конструкторе, поэтому переменая builder не инициализируется. Поэтому не срабатывает и delete. Как можно правильно обработать исключение, возникшее в конструкторе при создании объекта, и правильно удалить этот объект?
9.9K
11 июля 2005 года
shewa
20 / / 08.07.2005
ХЗ
284
11 июля 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by shewa
ХЗ


Другие варианты ?

430
12 июля 2005 года
craftyfox
157 / / 20.02.2000
Цитата:
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;
}

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
284
13 июля 2005 года
michael_is_98
587 / / 25.02.2005
А если предыдущий код изменить так
Код:
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-catch и здесь же создается объект класса, то при возникновении исключ. объект должен автомат. удаляться.
В этом случае компилятор не позволит использовать переменную builder за пределами try-catch (выдает ошибку).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог