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

Ваш аккаунт

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

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

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

Память и исключения

307
13 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Вот меня интересует такой вопрос, есть код
 
Код:
int fnFunc(int param1, int param2)
{
    .........................................
    if(param2) throw new myExepction(param2,.....);
    .........................................
}


Пользовательское исключение определено как
Код:
class myExepction
{
    char* str;
    int param;
    .............................
public:
    myExepction(............)
    {
         str = new char[100];
         ............................
    }
}


Где то вне функции fnFunc исключение перехватывается и обрабатывается, допустим так
 
Код:
catch(myExepction e)
{
    cout << "..................";
}


Вот меня, собственно, интересует что произойдет с памятью выделенной под оное исключение? Будет ли утечка памяти? Необходимо ли удалять это исключение как то явно? Или все таки оно будет удалено после обработки?

В общем, будут очень благодарен всем, кто разъяснит мне этот момент!
341
13 декабря 2008 года
Der Meister
874 / / 21.12.2007
[QUOTE=Artem_3A]Где то вне функции fnFunc исключение перехватывается и обрабатывается, допустим так[/QUOTE]Наверное, вы имели в виду так?
 
Код:
catch(myExepction * e)
[QUOTE=Artem_3A]Будет ли утечка памяти?[/QUOTE]Скорее всего, да. Удалять объект нужно, но когда необходимо это сделать - понять невозможно. Лучшее, что вы можете сделать при передаче исключения по указателю, выглядить будет примерно так:
 
Код:
int fnFunc(int param1, int param2)
{
    static myException exception;
    .........................................
    if(param2)
        throw &exception;
    .........................................
}
Вообще, перехват по указателю противоречит соглашениям, принятым в языке: например, базовые типы исключений мечутся как объекты, а не как указатели. Лучше перехватывать исключения по ссылке.
 
Код:
throw myException(...);

catch (myException & ex)
{
}
307
13 декабря 2008 года
Artem_3A
863 / / 11.04.2008
А в случае перехвата исключения по ссылки, я так понимаю утечки не будет, а где, а точнее в каком месте программы будет удалено данное исключение, по завершению обработки исключения?
341
13 декабря 2008 года
Der Meister
874 / / 21.12.2007
На всякий случай, поясню по примеру со сцылками дополнительно. Объект в throw всегда копируется, независимо от типа (даже если это ссылка на объект). Создание неименованного объекта myException делает его временным, что увеличивает шансы на то, что компилятор не выполнит копирование по-настоящему. Однако полагаться на него не стоит: если объект-исключение выделяет где-то дополнительную память и работает с ней по указателю, реализуйте конструктор копий (в вашем случае, можно просто заменить char * на string).
341
13 декабря 2008 года
Der Meister
874 / / 21.12.2007
[QUOTE=Artem_3A]а где, а точнее в каком месте программы будет удалено данное исключение, по завершению обработки исключения?[/QUOTE]Да, однако не помню как там обстоит с распространением исключений:
 
Код:
catch (myException & ex)
{
    throw;
}
Кажется, всё равно произойдёт копирование. Но могу ошибаться.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог