незванный гость писал(а):
Sanyok писал(а):
А между местом, где произошло исключение, и где его поймали - полет через вакуум?
А как насчет неструктурного goto? Тут полет через вакуум Вас не удивляет?
Просто применение goto дело добровольное
А в случае сбоев в конструкторе применение throw/try/catch - это скорее, дело добровольно-принудительное
. Второе (и, наверное, главное) - довольно плохо расписано, как эти исключения ловить. Я никак не мог найти, где черным по белому написано, какое исключение вырабатывается, если мы объем памяти превысили? Только это у меня заработало:
Код:
#include <stdio.h>
#include <memory>
class aclass
{
private:
int *ptr;
public:
aclass(unsigned N)
{ ptr = new int[N]; }
~aclass()
{ delete [] ptr; }
};
int main(int, char **)
{
aclass *p;
try
{ p = new aclass(0xFFFFFFFF); }
catch(std::bad_alloc)
{ p = NULL; }
printf(" pointer = %x \n", p);
if(p)
delete p;
return 0;
}
Причем я до std::bad_alloc допер методом проб и ошибок часа через полтора! Мож и попроще есть способы, без #include <memory> и std:: , но пока у меня получилось только так. Если каждый раз так искать, какое исключение ловить - можно поседеть лет на 30 раньше, чем рассчитывал (и прожить на столько же меньше
).
Как узнать, какое именно исключение вырабатывается и что нужно ловить?? В Borland'е что-то выходило (там хоть сообщение вылазило, что за исключение возникло) а в консольном приложении GCC - вообще, глухо, как в танке.
исправил орфорграфию