int fnFunc(int param1, int param2)
{
.........................................
if(param2) throw new myExepction(param2,.....);
.........................................
}
Память и исключения
Код:
Пользовательское исключение определено как
Код:
class myExepction
{
char* str;
int param;
.............................
public:
myExepction(............)
{
str = new char[100];
............................
}
}
{
char* str;
int param;
.............................
public:
myExepction(............)
{
str = new char[100];
............................
}
}
Где то вне функции fnFunc исключение перехватывается и обрабатывается, допустим так
Код:
catch(myExepction e)
{
cout << "..................";
}
{
cout << "..................";
}
Вот меня, собственно, интересует что произойдет с памятью выделенной под оное исключение? Будет ли утечка памяти? Необходимо ли удалять это исключение как то явно? Или все таки оно будет удалено после обработки?
В общем, будут очень благодарен всем, кто разъяснит мне этот момент!
Код:
catch(myExepction * e)
Код:
int fnFunc(int param1, int param2)
{
static myException exception;
.........................................
if(param2)
throw &exception;
.........................................
}
{
static myException exception;
.........................................
if(param2)
throw &exception;
.........................................
}
Код:
throw myException(...);
catch (myException & ex)
{
}
catch (myException & ex)
{
}
А в случае перехвата исключения по ссылки, я так понимаю утечки не будет, а где, а точнее в каком месте программы будет удалено данное исключение, по завершению обработки исключения?
На всякий случай, поясню по примеру со сцылками дополнительно. Объект в throw всегда копируется, независимо от типа (даже если это ссылка на объект). Создание неименованного объекта myException делает его временным, что увеличивает шансы на то, что компилятор не выполнит копирование по-настоящему. Однако полагаться на него не стоит: если объект-исключение выделяет где-то дополнительную память и работает с ней по указателю, реализуйте конструктор копий (в вашем случае, можно просто заменить char * на string).
Код:
catch (myException & ex)
{
throw;
}
{
throw;
}