probleme mit delete und mehreren klassen
-
hi,
ich habe folgendes Problem:
Ich habe drei Klassen: Datum, Ereignis, Ereignisarray. Datum ist eine Klasse die (was für eine Überraschung) ein Datum abspeichert. Ereignis besteht aus einer Datum-variable und einem dynamischen Text. EreignisArray erstellt dynamisch ein Array mit n-länge das von der Klasse Datum ist.
Hier ein Teil des Codes://erhöht die länge des arrays um n void CEreignisArray::increase(int n) { int i; CEreignis cache_d; CEreignisArray cache(max_s); for(i=0;i<max;i++) { cache.set(i,*array); } delete [] array; array=new CEreignis[max_s+i]; for(i=0;i<max;i++) { :arrow_right: cache_d=cache.get(i); array[i].setzen(cache_d.getDatum(),cache_d.getText()); } max_s+=n; } //Bei dem Pfeil wird als erstes der code hier aufgerufen: CEreignis CEreignisArray::get(int i)//gibt den Datensatz zurück { if(i<max) return array[i]; else cerr<<"Index außerhalb des gueltigen Bereichs"<<endl; return NULL; } //Dann das hier: CEreignis CEreignis::operator=( CEreignis &o) { CEreignis e; e.setzen(o.getDatum(),o.getText()); return e; } //dann wird auf einmal dieser destruktor aufgerufen: CEreignis::~CEreignis(void)//Destruktor { if(m_text) :arrow_right: delete m_text; }
Bei dem letzten Pfeil stürzt das Programm mit dieser fehlermeldung ab:
Debug Asserition failed!
Program:*Pfad der anwendung, ich schätze mal der ist unnötig*
File:dbgdel.cpp
Line:47
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Kann mir wer helfen(Ist ein Programm für die schule das ich bald abgeben muss)?
-
Ich hab mir deinen Code nicht genau angeschaut, da du keinen std::vector benutzt. Wenn du diesen innerhalb oder anstatt von CEreignisArray benutzt, solltest du sehr viel weniger Probleme haben und sehr viel Zeit und Nerven sparen.
-
Was genau ist std::vector? Ich habe bis jetzt noch nichts davon gehört...
-
Ein std::vector ist eine Container-Klasse aus der STL, d.h. das Ding ist
plattform unabhängig. Das Ding stellt in etwa einen dynamischen Array dar, d.h.
du greifst mittels Index auf die einzelnen Elemente zu ohne vor Gebrauch
die maximale Anzahl der Elemente zu wissen.mfg JJ
-
oh..tja CEreignisArray werde ich aber leider ned damit ersetzen können, da ich die Klassen vorgegeben habe, und die Funktionen sowie das main schreiben muss....weiß wer vielleicht eine andere Lösung auf mein Problem?
-
Archon schrieb:
oh..tja CEreignisArray werde ich aber leider ned damit ersetzen können, da ich die Klassen vorgegeben habe, und die Funktionen sowie das main schreiben muss....weiß wer vielleicht eine andere Lösung auf mein Problem?
Dein CEreignisArray kann aber einen std::vector benutzen. Dieser sollte in jedem C++ Kurs oder Buch eingehend beschrieben werden, bevor man mit Arrays hantiert.
-
Interessant, ich habe schon seit einem Schuljahr Programmieren(C/C++),aber noch nie was von den std::vector gehört, Arrays pointer etc. haben wir aber schon gemacht.....
Wie funktioniert std::vector?
-
Da die STL bei jedem Compiler dabei ist, hilft am besten ein Blick in die
jeweilige Dokumentation.Alternativ:
http://www.sgi.com/tech/stl/mfg JJ
-
Archon schrieb:
Interessant, ich habe schon seit einem Schuljahr Programmieren(C/C++),aber noch nie was von den std::vector gehört, Arrays pointer etc. haben wir aber schon gemacht.....
Wie funktioniert std::vector?Da hat dein Lehrer IMHO einige grundlegende Fehler gemacht.
-
Wie kommt das eigentlich dass bei delete fehler auftreten können? Kommt ein Fehler z.b.: raus wenn ich versuche einen schon mit delete gelöschten Speicher nochmals mit delete zu löschen?.....(ich hasse englische Beschreibungen - aber anscheinend muss ich mich an die gewöhnen, wenn aber wer in dem oben genannten Code einen Fehler findet bitte sagen....!)
-
Doppeltes delete solltest du in jedem Fall dadurch vermeiden, indem du Pointer,
die du mittels delete gelöscht hast, auf 0 setzt. Denn delete auf 0 richtet
garantiert keinen Schaden an.mfg JJ
-
- Eine Ursache könnte sein, dass Du im Konstruktor von CEreignis den Pointer nicht mit 0 initialisierst. Wenn dann der Pointer vor dem Destruktor-Aufruf nicht irgendwo vernünftig gesetzt wird, dann hast Du das geschilderte Verhalten.
- Erstellst Du vielleicht in Deinem Programm irgendwo eine Kopie von CEreignis durch einen Kopier-Konstruktor? Wenn nicht, solltest Du diesen implementieren, andernfalls zeigen 2 Pointer auf dieselbe Speicheradresse und es kommt zu einem doppelten delete.
-
An dem Kopierkonstruktor könnte es liegen
EDIT:Danke, das hat geholfen!