Verkette Liste hat ein Problem



  • Hallo!
    ich baue gerade eine verkettete Liste, nur leider stürzt das Programm mit der klassischen Win-Fehlermeldung ab, der Compiler/Linker sagt nichts.
    Der Code:

    element.h (Kontainer-Klasse)

    #ifndef ELEMENT_H
    #define ELEMENT_H
    
    template <class T>
    class Element {
    
    private:
    	T value;
    	Element<T> *next;
    
    public:
    	Element() { }
    	~Element() {
    		delete next;
    	}
    	Element(T& t);
    	Element<T> *Append(T&);
    
    };
    
    template <class T>
    Element<T>::Element(T& t) {
    	next = new Element<T>;
    }
    
    template <class T>
    Element<T>* Element<T>::Append(T &t) {
    	if(next)
    		next = next->Append(t);
    	else
    		value = t;
    	return this;
    }
    
    #endif
    

    liste.h (die eigentliche Liste)

    #ifndef LISTE_H
    #define LISTE_H
    
    template <class T>
    class Liste {
    
    private:
    	Element<T> *pointer;
    
    public:
    	Liste();
    	~Liste();
    	void push_back(T&);
    
    };
    
    template <class T>
    Liste<T>::Liste() {
    	std::cout << "Liste geladen" << std::endl;
    	pointer = new Element<T>;
    }
    
    template <class T>
    void Liste<T>::push_back(T& t) {
    	pointer->Append(t);
    }
    
    template <class T>
    Liste<T>::~Liste() {
    	delete pointer;
    }
    
    #endif
    

    Der Absturz erfolgt im Hauptprogramm durch den Konstruktoraufruf der Liste, z.B.

    Liste<int> liste1;
    

    Woran kann das liegen? Ich tippe mal auf Speicherverletzung, aber wo?



  • Ad aCTa schrieb:

    Liste<int> liste1;
    

    Woran kann das liegen? Ich tippe mal auf Speicherverletzung, aber wo?

    Weil Du in Zeile 21-24 von element.h einen recurvise aufgerufen Constructor hast, ohne Abbruchbedingung.



  • hartmut1164 schrieb:

    Ad aCTa schrieb:

    Liste<int> liste1;
    

    Woran kann das liegen? Ich tippe mal auf Speicherverletzung, aber wo?

    Weil Du in Zeile 21-24 von element.h einen recurvise aufgerufen Constructor hast, ohne Abbruchbedingung.

    Wieso denn? Ich rufe doch konkret in Z 21-24 nur den Standart-Konstruktor auf, der wiederrum nichts macht:

    Element() { }
    

    Wo ist da die Rekursion?



  • Element<T>::Element(T& t) {
        next = new Element<T>;
    }
    

    Klaro hier, haste eine Rekursion.new, ruft immer den Ctor auf...Somit wird der immer und immer wieder aufgerufen.



  • quatsch...
    es wird im COPY-Ctor der Standard-CTOR aufgerufen...

    bb

    edit: da sollte btw noch nen const hin -> (const T &t) 😛



  • Ad aCTa schrieb:

    ich baue gerade eine verkettete Liste, nur leider stürzt das Programm mit der klassischen Win-Fehlermeldung ab, der Compiler/Linker sagt nichts.

    Würdest du das Programm mit einem Debugger ausführen, könntest du mit grosser Wahrscheinlichkeit gerade sehen, wo das Programm abstürzt und entsprechende Variablen prüfen...

    Achte darauf, deine Variablen zu initialisieren. Dazu gehört Zeiger auf Null setzen, wenn diese ungültig sind.


Anmelden zum Antworten