Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekte im Array korrekt löschen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.02.2006, 13:05 Uhr
~dotcom
Gast


hallo zusammen,
ich habe ein kleines Programm zum Aufbau eines Stacks. Darin kann eine bestimmte Anzahl an Elementen in einem Array gespeichert werden. Soweit so gut. Mein Problem liegt nun in der korrekten Speicherfreigabe der Objekte, sobald der Stack wieder verschwindet.

Hier das Programm:

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

//Hilfs-Klasse
class A
{
    public:
        A(){cout << "\terstellt" << endl; kopie=0;}
        A(const A& ref){cout << "\tKopie erstellt" << endl; kopie = 1;}
        ~A()
        {
            if(kopie == 1)
                cout << "\tKopie entfernt" << endl;
            else
                cout << "\tentfernt" << endl;
        }
    private:
        int kopie;
};


template<class T> class MeinStack
{
    int SPtr;   // Index des obersten Elements
    T* Array;   // Zeiger auf das erste Element
    int Max;    // Anzahl der reservierten Array-Elemente
public:
    MeinStack(int s):SPtr(-1), Max(s){Array = new T[s];}
    ~MeinStack();
    void push(T a);
    T pop();
    bool full();
    bool empty();
};
// -- Implementierung ---

template<class T>
inline MeinStack<T>::~MeinStack()
{
    delete [] Array;
    cout << "Array geloescht" << endl;
}

template<class T>
inline void MeinStack<T>::push(T a)
{
    assert(!full());
    Array[SPtr++] = a;
    
}

template <class T>
inline T MeinStack<T>::pop()
{
    assert(!empty());
    return Array[SPtr--];
}

template<class T>
inline bool MeinStack<T>::full()
{
    return (SPtr+1)==Max;
}

template<class T>
inline bool MeinStack<T>::empty()
{
    return SPtr < 0;
}

// --- main-Funktion ---
int main()
{
    cout << "Erstelle einen Stack mit fuenf A-Elementen" << endl;
    MeinStack<A> einStack(5);
    cout << "Erstelle ein A-Objekt und fuege es dem Stack hinzu" << endl;
    A einObjekt;                // anderes Verhalten...
    einStack.push(einObjekt);   // ...falls auskommentiert
    cout << "Programm-Ende" << endl;
    
    
    
    system("Pause");
    return 0;




Die Ausgabe des Programms:

Code:
Erstelle einen Stack mit fuenf A-Elementen
        erstellt
        erstellt
        erstellt
        erstellt
        erstellt
Erstelle ein A-Objekt und fuege es dem Stack hinzu
        erstellt
        Kopie erstellt
        Kopie entfernt
Programm-Ende
Drücken Sie eine beliebige Taste . . .
        entfernt
        entfernt
Array geloescht



Warum werden nicht alle Elemente des Arrays gelöscht, sondern offenbar nur das, was ich per push(einObjekt) hinzugefügt habe.
Entferne ich nämlich die beiden in der main-Methode angegebenen Zeilen oder kommentier sie aus, ist die Ausgabe wie erwartet:


Code:
Erstelle einen Stack mit fuenf A-Elementen
        erstellt
        erstellt
        erstellt
        erstellt
        erstellt
Erstelle ein A-Objekt und fuege es dem Stack hinzu
Programm-Ende
Drücken Sie eine beliebige Taste . . .
        entfernt
        entfernt
        entfernt
        entfernt
        entfernt
Array geloescht



Ich hoffe mir kann das jemand erklären.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.02.2006, 13:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Das kommt, weil Deine Stackklasse defekt ist und den Speicher zerschiesst, wenn Du push aufrufst. Tipp: überlege, welchen Inhalt SPtr beim ersten Aufruf von push hat und welches Der Unterschied zwischen SPtr++ und ++SPtr ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 20.02.2006 um 13:47 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.02.2006, 14:35 Uhr
~dotcom
Gast


Hoppla, wie schnell doch ein so kleiner Fehler völlige Verwirrung schaffen kann.
Besten Dank für die Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: