C++: Programm stürzt nach Exception behandlung ab

ArcVieh

Grünschnabel
Hallo,


ich hab mal wieder ein kleines Problem, an dem ich schon ein ganzes Weilchen rumtüftel:
Ich habe mir ein struct StackUnderflow geschrieben, welches ich werfe, wenn mein selbstgeschriebener struct stack voll ist.

C++:
#include <string>
#include <iostream>
using namespace std;


struct StackUnderflow {
    public:
        void ausgeben();
};

void StackUnderflow::ausgeben() {
    cout << "Der Stack ist leer!" << endl;
}


Der relevante Code, wo das Programm abstürzt sieht so aus:
C++:
MyStack::pop() {
    try {
        if(isEmpty()) {
            throw StackUnderflow();
        }

        return elements[countElements--];
    } catch(StackUnderflow& e) {
        e.ausgeben();
    }
}


e.ausgeben() wird auch aufgerufen und es wird auch der Text ausgegeben, danach stürzt das Programm einfach ab.
Der Debugger hilft mir gar nicht weiter, der stürzt einfach ab.


Kann mir jemand helfen?




Grüße,
ArcVieh
 
Hm, was genau meinst Du? Wäre es Java, könnte ich es dir posten, aber CodeBlocks gibt mir nicht wirklich viel:

Code:
#0 6FC4DFD4	libstdc++-6!__cxa_demangle() (C:\MinGW\bin\libstdc++-6.dll:****)
#1 00000000	0x7efde000 in ****() (****:****)
Das kommt im Callstack, wenn ich mit dem Debugger zur besagten Absturzstelle springe.

Code:
Process terminated with status -1073741819 (0 minutes, 13 seconds)
Und das, wenn ich das Programm normal ausführe.
 
C++:
#include <time.h>
#include <string>
#include <iostream>
using namespace std;

struct element {
    string name;
    tm datum;
};

C++:
#define MAX_STACK_SIZE 3
#include "element.h"


struct MyStack {
    private:
        int countElements;
        element elements[MAX_STACK_SIZE];

        void reSort();

    public:
        void push(element elem);
        element pop();
        bool isEmpty();
        bool isFull();

        MyStack() {
            countElements = 0;
        }

        MyStack &operator=(const MyStack &obj) {
            int i;

            countElements = obj.countElements;
            for(i = 0; i < MAX_STACK_SIZE; ++i) {
                elements[i] = obj.elements[i];
            }

            return *this;
        }
};


struct StackUnderflow {
    public:
        void ausgeben();
};
C++:
#include "MyStack.h"

void MyStack::push(element elem) {
    if(isFull()) {
        reSort();
    }

    elements[countElements] = elem;

    if(countElements < MAX_STACK_SIZE) {
        ++countElements;
    }
}

newAktie MyStack::pop() {
    try {
        if(isEmpty()) {
            throw StackUnderflow();
        }

        return elements[countElements--];
    } catch(StackUnderflow& e) {
        e.ausgeben();
    }
}

bool MyStack::isEmpty() {
    return countElements == 0;
}

bool MyStack::isFull() {
    return countElements == MAX_STACK_SIZE;
}

void MyStack::reSort() {
    for(int i = 0; i < countElements - 1; i++) {
        elements[i] = elements[i + 1];
    }
}

void StackUnderflow::ausgeben() {
    cout << "Der Stack ist leer!" <<endl;
}


Habe Name des Stacks, Variablen und Co angepasst, damit diese generell verständlicher sind.
 
Hi.

Wie rufst du denn die Methode pop auf? Und vor allem: welchen Rückgabetyp hat diese Methode?

Problemtisch ist jedenfalls, das du die Ausnahme direkt in der Methode fängst und demnach keinen Rückgabewert lieferst, obwohl die Methode eigentlich einen Wert zurückgibt.

Zeig am besten ein vollständiges Programm.

\edit: Hab gerade deinen Code gesehen. Der Grund des Absturzes ist der fehlende Rückgabewert. Du mußt immer einen Wert zurückgeben oder eine Exception werfen. Der Compiler sollte dich eigentlich warnen, dass nicht alle Codepfade einen Wert zurückgeben.

Gruß
 
Zuletzt bearbeitet:
Blubb.
Eigentlich weiß ich das und ja, der Compiler müsste mich warnen... Tut er aber nicht. :/
Vielen Dank! Ich werfe im catch einfach den Exception noch eine Station weiter. :)

Danke!
 
Zurück