Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » fehlermeldung/ Destruktor

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
16.12.2005, 13:29 Uhr
~tillle
Gast


Hallo

Ich habe eine Klass Stack: Wie folgt:

C++:
class stack
{
private:
  unsigned int size;
  double* p;
  int anzEl;

public:
  stack(): size(0), p(0), anzEl(0){};

  stack(unsigned int _size);
  ~stack();

  bool isEmpty() const
    {return (anzEl == 0);}

  bool isFull() const
    {return (anzEl >= size);}

  int getSize() const
    {return anzEl;}

  void clear();
  void push(double _el);
  double pop();
};



der Destruktor sieht so aus:

C++:
stack::~stack()
{
  if (p)
    delete[] p;
}



die anderen dateien hänge ich mal nicht an.
In der Testdatei, rufe ich push pop und so manchmal auf. Die letzte Methode die ich aufrufe ist isEmpty()...
Dann kommt die Fehlermeldung:
*** glibc detected *** double free or corruption (out): 0x0804b018 ***
Abort

verstehe ich nicht. Ich gebe doch den Speicher frei, was meckert der dann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.12.2005, 13:40 Uhr
ao

(Operator)


Du gibst den Speicher mehrfach frei, oder schreibst ihn zwischendurch kaputt. Das sagt die Fehlermeldung.

Vielleicht solltest du doch ein bisschen Code zeigen, z.B. das Testprogramm und die Implementierung des Konstruktors. Hast du vielleicht einen expliziten Destruktoraufruf programmiert?

Der Defaultkonstruktor (Stack mit Größe 0) ist ziemlich nutzlos, du solltest ihn verschwinden lassen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.12.2005, 16:31 Uhr
~tillle
Gast


ok dann hier noch ein bisschen mehr code:

also mein Testprogramm sieht so aus:

C++:
#include "stack.h"

using namespace std;


int main()
{
  stack meinstack(4);
  
  cout << "Stack leer?" << endl;
  if (meinstack.isEmpty())
    {
      cout << "leerer Stack" << endl;
    }else{
      cout << "Stack nicht leer" << endl;
    }

  cout << "Stack voll?" << endl;
  if (meinstack.isFull())
    {
      cout << "voller Stack" << endl;
    }else{
      cout << "Stack nicht voll" << endl;
    }
  
  cout << "Stack füllen mit 3 5 122 " << endl;
  meinstack.push(3);
  meinstack.push(5);
  meinstack.push(122);
  
  cout << "ein Element entnehmen" << endl;
  meinstack.pop();

  cout << "Stack leer?" << endl;
  if (meinstack.isEmpty())
    {
      cout << "leerer Stack" << endl;
    }else{
      cout << "Stack nicht leer" << endl;
    }

  return 0;

}



und dann hier noch die Konstruktoren:

C++:
stack(): size(0), p(0), anzEl(0){};

stack::stack(unsigned int _size): size(_size)
{
  p = new double[_size];
}


kann es vielleicht an so einem return liegen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.12.2005, 16:57 Uhr
ao

(Operator)


Da seh ich keinen Fehler. Dann bitte noch die Implementierungen von push, pop und clear.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.12.2005, 17:11 Uhr
~tillle
Gast


Hallo

So ich habe jetzt noch ein bisschen rumgemacht, allerdings hat das eher zum Unverständnis beigetragen, denn : es tut, aber ich habe quasie den Speicher nicht extra freigegeben und ich dachte aber, dass man eben das muss, wenn man mit new Speicher anlegt.
So dann schicke ich dir noch die stack.cc.
Das was auskommentiert ist gilt also dann


C++:
#include "stack.h"

using namespace std;


stack::stack(unsigned int _size): size(_size)
{
  p = new double[_size];
}

/**stack::~stack()
{
  cout << "ein destruktor" << endl;
  if (p)
    cout << "mitte destruktor" << endl;
    delete[] p;
  cout << "aus destruktor" << endl;
}
*/


void stack::clear()
{
  for (unsigned int i = 0; i < size; i++)
    {
      p[i] = 0;
    }
}

void stack::push(double _el)
{
  while(*p != 0)
    p++;
  
  *p = _el;
  anzEl++;
  cout << *p << endl;
}

double stack::pop()
{
  while (*p != 0)
    {p++;}

  p--;
  anzEl--;
  cout << *p << endl;
  return *p;
}


 
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: