Ł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 :PDzię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 » |