Thread View: pl.comp.lang.c
3 messages
3 total messages
Started by Borneq
Tue, 10 May 2016 16:14
catch nie łapie mojego typu wyjątku, tylko wskaźnik na niego
Author: Borneq
Date: Tue, 10 May 2016 16:14
Date: Tue, 10 May 2016 16:14
28 lines
1418 bytes
1418 bytes
Mam zdefiniowany typ
class Exception
{
public:
Exception(const char *_message = "unknown", int _n = 0) throw() {
sth..
}
};
rzucam wyjątek : throw new Exception("No more bytes in stream");
i okazuje się że
catch (Exception &e)
{
result = EOF;
}
nie działa, działa
catch (...)
{
result = EOF;
}
ale co ciekawe, działa
catch (Exception *e)
{
result = EOF;
}
tak bardzo nie przeszkadza, ale zwykle jest w catch co innego:
http://www.cplusplus.com/doc/tutorial/exceptions/
Re: catch nie łapie mojego typu wyjątku, tylko wskaźnik na niego
Author: Borneq
Date: Tue, 10 May 2016 16:17
Date: Tue, 10 May 2016 16:17
7 lines
1268 bytes
1268 bytes
W dniu 10.05.2016 o 18:14, Borneq pisze: > tak bardzo nie przeszkadza, ale zwykle jest w catch co innego: > http://www.cplusplus.com/doc/tutorial/exceptions/ Ale uwaga, dlatego że wołam throw new Exception() a mógłbym wołać throw Exception() ? czy ta druga metoda jest lepsza? a pierwsza niekoniecznie zwalnia mi pamięć?
Re: catch nie łapie mojego typu wyjątku, tylko wskaźnik na niego
Author: keiichi
Date: Tue, 10 May 2016 17:38
Date: Tue, 10 May 2016 17:38
26 lines
2389 bytes
2389 bytes
W dniu 2016-05-10 o 18:17, Borneq pisze: > W dniu 10.05.2016 o 18:14, Borneq pisze: >> tak bardzo nie przeszkadza, ale zwykle jest w catch co innego: >> http://www.cplusplus.com/doc/tutorial/exceptions/ > > Ale uwaga, dlatego że wołam throw new Exception() > a mógłbym wołać throw Exception() ? > czy ta druga metoda jest lepsza? a pierwsza niekoniecznie zwalnia mi > pamięć? Tak, jest praktycznie w każdym wypadku druga jest lepsza. Zazwyczaj nie chcesz rzucać wyjątku przez wskaźnik. Nie wiadomo gdzie potem zwolnić pamięć. Kompilator sam tego nie robi i masz wycieki w podanym przykładzie. Zazwyczaj warto łapać wyjątek przez referencję (chyba że obiekt wyjątku jest bardzo mały i łapanie przez wartość nie powoduje dużego narzutu). Niektóre stare biblioteki (np. MFC) wymagały (i nadal chyba? wymagają) rzucania wyjątków przez wskaźnik. Prawdopodobnie ze względów wydajnościowych, gdy w latach chyba jeszcze 90-tych optymalizatory C++ były nie tak dobre jak obecnie. Aby poradzić sobie ze zwalnianiem przydzielanej pamięci tworzona była lista przydzielonych wyjątków i potem gdy program nie miał co robić, jechał po liście i zwalniał w tle pamięć (tak w telegraficznym skrócie). Nie chcesz tego robić samemu. Pozdrawiam
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads