Woodstock Geschrieben 28. März 2002 Teilen Geschrieben 28. März 2002 Hallo! Ich habe mal wieder eine Frage! Ich habe hier einen Auszug aus einem meiner Programme. Damit erzeuge ich dynamisch eine Liste, und auch Speicherplatz für ein Wort. Wie muss ich den Destruktor definieren, um den Speicherbereich wieder frei zu geben? Auszug: fFound = verifyChar(szWord, nNumber); if(fFound!=true) // kam das Wort noch nicht vor { m_pEndChar->next = new caElementChar; m_pEndChar = m_pEndChar->next; m_pEndChar->Filenumber.add(nNumber); m_pEndChar->pszWord = new char[(strlen(szWord))]; strcpy(m_pEndChar->pszWord, szWord); cout << m_pEndChar->pszWord << endl; m_pEndChar->next = NULL; }[/PHP] Destruktor:[PHP]caCharacterList::~caCharacterList() // Destruktor { ????? } Bine Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 28. März 2002 Teilen Geschrieben 28. März 2002 Pieps, tja, da musst Du alles, was mit new/new[] allokiert worden ist, mit delete bzw. delete [] wieder freigeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Woodstock Geschrieben 28. März 2002 Autor Teilen Geschrieben 28. März 2002 Hab ich schon versucht. Aber wie muss ich das schreiben? Ich allokiere nur an der Stelle speicherplatz mit new, sonst nirgends. Bine Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. März 2002 Teilen Geschrieben 28. März 2002 Im Destruktor von caElementChar musst Du pszWord freigeben. In caCharacterList hast Du wahrscheinlich einen Zeiger auf das erste Element der Liste. Dann sieht der Destruktor in etwa so aus: caCharacterList::~caCharacterList { while( m_pFirst /*oder wie der bei Dir heißt*/ ) { caElementChar* pHelp = m_pFirst->next; delete m_pFirst; m_pFirst = pHelp; } }[/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. März 2002 Teilen Geschrieben 28. März 2002 Nachtrag: Unbedingt ein Zeichen mehr holen, als strlen zurückgibt, sonst passt das String-Ende-Zeichen nicht mehr mit rein. Also: m_pEndChar->pszWord = new char[strlen(szWord)+1]; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Orffi Geschrieben 28. März 2002 Teilen Geschrieben 28. März 2002 Was Klotzkopf schreibt ist ganz, ganz wichtig! Am Ende eines char Arrays wird noch '\0' angehängt. Wenn man dafür keinen Speicherplatz reserviert kann alles passieren. Es kann sein, daß das Programm funktioniert, es kann sein, daß das Programm bei ersten Aufruf abstürzt oder es kann irgendwann abstürzen. Im Allgemeinen ist so ein Problem unter Umständen sehr häßlich zu debuggen. Ansonsten geht Klotzkopf bei seiner Lösung durch die Liste und gibt jedes einzelne Element frei, wobei er sich den Zeiger auf das nächste Element merkt, damit er dann dieses Element frei geben kann und so weiter und so fort... HTH Jan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Woodstock Geschrieben 29. März 2002 Autor Teilen Geschrieben 29. März 2002 Das mit dem '\0' hab ich schon geändert gehabt bevor Klotzkopp das geschrieben hat. Aber es funktioniert trotzdem irgendwie nicht. Bine Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. März 2002 Teilen Geschrieben 29. März 2002 Was genau funktioniert denn nicht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hoagi Geschrieben 29. März 2002 Teilen Geschrieben 29. März 2002 Ich denke mal in der von Klotzkopf vorgeschlagenen Lösung fehlt noch ein delete m_pFirst->pszWord[]; vor dem delete m_pFirst; Um den Speicher für das CHaracterarray freizugeben. Hoagi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 1. April 2002 Teilen Geschrieben 1. April 2002 Stimmt! Das sollte wirklich vorher noch freigegeben werden, damit´s keinen Ärger gibt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. April 2002 Teilen Geschrieben 1. April 2002 Original geschrieben von hoagi Ich denke mal in der von Klotzkopf vorgeschlagenen Lösung fehlt noch ein delete m_pFirst->pszWord[]; vor dem delete m_pFirst; Ich denke, das gehört, wie ich es oben auch beschrieben habe, eher in den Destruktor von caElementChar. Dann braucht man sich nicht an jeder Stelle, wo so ein Objekt freigegeben wird, um den internen Aufbau der Struktur/Klasse zu kümmern. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hoagi Geschrieben 1. April 2002 Teilen Geschrieben 1. April 2002 Wer lesen kann ist klar im Vorteil. Hast Recht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 2. April 2002 Teilen Geschrieben 2. April 2002 Genau. Es sollte am besten jedes Objekt immer für seine eigene Destruktion verantwortlich sein. Das erspart viel Ärger und macht Fehlersuche einfacher. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.