Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Łapanie błędów nie działa

Ostatnio zmodyfikowano 2021-12-23 14:38
Autor Wiadomość
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?
C/C++
#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();
   
   
}
P-179137
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:

C/C++
throw TwojaKlasaWyjatku( "wyjatek" );

oraz łapać go tak:
C/C++
try
{
   
//...
} catch( const TwojaKlasaWyjatku & wyjatek )
{
   
//...
}
P-179138
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.
P-179139
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.
P-179140
« 1 »
  Strona 1 z 1