Łapanie błędów nie działa
Ostatnio zmodyfikowano 2021-12-23 14:38
Simlas1337 Temat założony przez niniejszego użytkownika |
Łapanie błędów nie działa » 2021-12-20 12:59:17 Witam, mam problem z łapaniem błędów. Pomimo zapisania try catch throw nadal wyskakują mi memory leak w codeblocks, a w visualu pokazuje wyjątki. Jaki błąd popełniłem? #include <iostream> using namespace std; class Wyjatek { private: int numer; string opis; public: Wyjatek( int nr = 0, string op = "brak" ) { numer = nr; opis = op; } ~Wyjatek() { cout << "Jestem w destruktorze klasy Wyjatek"; } int getNum() { return numer; } string getOpis() { return opis; } }; class Stos { private: int * tablica; public: Stos() { int * tablica = new int[ 10 ]; cout << "Jestem w konstruktorze klasy stos"; } ~Stos() { cout << "Jestem w destruktorze klasy stos"; delete[ ] tablica; } void push( int arg = 0, int i = 0 ) { if( i > 9 ) { Wyjatek * wyjatek = new Wyjatek( 1, "BLAD METODY PUSH" ); throw wyjatek; } else { tablica[ i ] = arg; } } int pop( int i ) { if( i > 9 ) { Wyjatek * wyjatek = new Wyjatek( 2, "BLAD METODY POP" ); throw wyjatek; } else { return tablica[ i ]; } } }; class Symulacja { private: Stos * stos; public: Symulacja() { cout << "Konstruktor symulacja " << endl; stos = new Stos(); }; ~Symulacja() { cout << "Destruktor symulacja" << endl; delete stos; } void symulacja(); }; void Symulacja::symulacja() { for( int i = 0; i <= 10; i++ ) { try { stos->push( i, i ); } catch( Wyjatek * w ) { cout << w->getNum() << " " << w->getOpis(); } } for( int i = 0; i <= 10; i++ ) { try { stos->pop( i ); } catch( Wyjatek * w ) { cout << w->getNum() << " " << w->getOpis(); } } } int main() { std::cout << "Hello World!\n"; Symulacja symulacja; symulacja.symulacja(); }
|
|
DejaVu |
» 2021-12-20 13:01:49 Nie wiem czy dobrze zrozumiałem Twoją wypowiedź, ale try/catch nie zapewnia Ci, że nie będzie wycieków pamięci. /edit: A Twój problem to taki, że tworzysz obiekt dynamiczną alokacją pamięci, aby rzucić wyjątkiem i potem ten obiekt zostaje w pamięci, więc powoduje wyciek pamięci. Powinieneś raczej rzucać wyjątek tak: throw TwojaKlasaWyjatku( "wyjatek" );
oraz łapać go tak: try { } catch( const TwojaKlasaWyjatku & wyjatek ) { }
|
|
Simlas1337 Temat założony przez niniejszego użytkownika |
» 2021-12-20 13:06:46 Zadanie z labów ze studiów, miałem dokładnie tak zapisać throw jak powyżej. Błędem okazało się redefinicja int* tablica w klasie stos. Kompilator nie mógł tego znaleźć. Mały błąd, a powoduje tyle błędów :P Dziękuje za każdą próbę pomocy, przy okazji nauczyłem się nowej składki z c++ z postu powyżej. |
|
pekfos |
» 2021-12-23 14:38:31 Własna klasa wyjątku powinna dziedziczyć po std::exception i używać jej interfejsu. Jakbyś miał 10 typów swoich wyjątków, to byś musiał pisać 10 klauzul catch żeby móc łapać wszystkie. A jeśli chcesz tylko wypisać opis wyjątku, lepiej łapać std::exception, co złapie twoje typy, wyjątki z biblioteki standardowej i innych. |
|
« 1 » |