Löschen von dynamisch alloziertem Speicher
-
Hallo NG
Ich bin relativ neu in C++, verzeiht mir also die vielleicht dumme Frage.
Ich hab mir eine Funktion gebaut, um Umlaute wie ä, ö oder ü in der Dos-Konsole korrekt anzeigen zu können.
char* convertUmlaut(char* theString) { size_t length = strlen(theString) + 1; //+ 1 für Stringabschluss char *strNew; strNew = new char[length]; for(unsigned int i=0; i < length-1; i++) { switch((int)theString[i]) { case -42: // Ö strNew[i] = '\x99'; break; case -36: // Ü strNew[i] = '\x9A'; break; case -60: // Ä strNew[i] = '\x8E'; break; case -28: // ä strNew[i] = '\x84'; break; case -4: // ü strNew[i] = '\x81'; break; case -10: // ö strNew[i] = '\x94'; break; case -33: // ß strNew[i] = '\xE1'; break; default: strNew[i] = theString[i]; } // Von switch } // Von for strNew[i]='\0'; // Stringabschluss anfügen. //delete[] strNew; //strNew = 0; return theString; }
Wie kann ich jetzt aber strNew löschen? Wenn ich delete[] strNew; vor dem return theString; aufrufe, erhalte ich natürlich Schrott zurück
Hat mir jemand vielleicht einen kleinen Tipp?
Besten Dank!
-
Wie du richtig erkannt hast, darf der Speicher innerhalb der Funktion nicht gelöscht werden. Ausserdem nicht den Originalzeiger zurückgeben, sondern natürlich den mit new[] angeforderten
Das ganze muss ausserhalb passieren:
char * converted = convertUmlaut("düdldü"); cout<<converted<<endl; delete[] converted;
Die Verwendung ist allerdings nicht toll auf diese Weise.
Wie oft wird das delete wohl vergessenSpontan würden mir zwei Möglichkeiten einfallen, das zum umgehen.
-
statt einen neuen String zurückzugeben, die Umlaute im Originalstring ersetzten
-
schau dich mal nach std::string um
-
-
Hallo anonymus
Besten Dank für deine Antwort! Wusste gar nicht, dass man Speicher, den man in einer anderen Funktion alloziert hat, ausserhalb wieder deleten kann... Coole Sache!
Hmm, String tönt gut, ich werde mir das mal anschauen!
Vielen Dank für die Hilfe!
-
crazy-mike schrieb:
Wusste gar nicht, dass man Speicher, den man in einer anderen Funktion alloziert hat, ausserhalb wieder deleten kann... Coole Sache!
Das mag zwar cool sein, aber übersichtlicher macht es weder den Code noch wird die Handhabung der Funktionen einfacher...
Empfehlen würde ich deswegen in C++:
std::string convertUmlaut(LPCSTR szText);
und als C:
void convertUmlaut(LPCTSTR szText, SIZE_T nBufSize, LPTSTR szBuffer);
Hier musst Du dann einen genügend grossen Buffer übergeben und die grösse in "nBufSize" angeben (wenn Du im vorrauserfahren willst, wie gross der Buffer sein muss, so kannst Du einfach "nBufSize" als "SIZE_T *pnBufSize" machen und dann beim ersten Aufruf in "szBuffer" NULL übergeben... dann sollte die Funktion die geforderte größe in "pnBufSize" zurückgeben...