Problem beim Löschen eines dynamischen Arrays
-
Hallo,
ich verzweifle hier an folgendem Problem.
Zuerst einmal das Programmfragment:Datei test.cpp
if(!zp)
cout<<"!Fehler! Im Puffer sind noch keine Zeichen enthalten!"<<endl;
else
{
pi<<zp;
cout<<"Der Puffer enthält folgende Zeichen:"<<endl;
for (i=0;i<zp;i++)
cout<<i+1<<".Stelle: "<<pi[i]<<endl;
delete [] pi;
}Datei pufer.h
friend void operator<<(char*& ,const Puffer& );Datei puffer.cpp:
// Operator << zur Bereitstellung des Pufferinhalts in einem dynamisch erzeugtem String
void operator<<(char*& kopie,const Puffer& inhalt)
{
kopie=new char[inhalt.aklaenge];
kopie=inhalt.puffer;
}Das Problem ist,dass jedes Mal,wenn ich zweimal hintereinanderden Pufferinhalt
in pi speichern und ausgeben möchte,beim zweiten Mal die Fehlermeldung
Debug Assertation Failed!Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Das gleiche passiert beim Beenden des Programms.
Ich habe schon herausgefunden,dass diese Fehlermeldung erscheint,wenn ein
nicht reservierter Speicher freigegeben werden soll.
Ich kann allerdings meinen Fehler nicht finden!!Kann mir einer helfen?
-
TobiG schrieb:
Datei pufer.h
friend void operator<<(char*& ,const Puffer& );Datei puffer.cpp:
// Operator << zur Bereitstellung des Pufferinhalts in einem dynamisch erzeugtem String
void operator<<(char*& kopie,const Puffer& inhalt)
{
kopie=new char[inhalt.aklaenge];
kopie=inhalt.puffer;
}Also deine Deklaration sieht zwar mekrwürdig aus, scheint aber ja zu funktionieren.
Du versuchst 2 mal Speicher für kopie zu allozieren ohne den alten freizugen.
Wie wärs wenn du testest ob kopie bereits speicher alloziert hat ?.Ausserdem würde ich die Zeichen die sich in inhalt.puffer befinden mittels strcpy oder derivaten copieren sonst brauchst du nämlich auch keinen Speicher zu allozieren.
Dann würde:
kopie=inhal.puffer;
reichen.
Also mein Vorschlag
void operator<<(char *kopie,const Puffer &buff) { if(kopie) delete []kopie; kopie=new char [buff.aklaenge]; if(!kopie) //errorhandling return; strcpy(kopie,buff.puffer); }
-
Tag,
Öhm warum machst du überhaupt diesen Operator ?
Du kannst doch direct kopieren oder zuweisen.