Hallo, ich habe ein Problem mit der "delete"-Funktion. Folgender Code liegt dem zu Grunde: [c] char *fp1; fp1 = new char [255]; fp1="zulaessig!\n"; delete[] fp1; [\c] Beim Start bekomme ich die Fehlermeldung im Anhang. Kann mir jemand sagen wo mein Fehler bei der Verwendung von der "delete"-Funktion liegt? Vielen Dank! LG M.S.
Wenn du ein String-Literal, ala "abc", verwendest reserviert der Compiler automatisch Speicher im Read-Only-Bereich des Programmes. Du musst dafür keinen eigenen Speicher reservieren. Das fp1="...."; lässt du den fp1-Pointer auf diesen Speicherbereich zeigen, und der zuvor per "new" angeforderte Bereich wird vergessen (Memory Leak!). Den Speicher den der Compiler für das String-Literal angefordert hat darfst du aber nicht per "delete" freigeben, das passiert automatisch bei Programm-Ende. Da du aber C++ verwendest, kannst du dir die ganze C-typische Frickelei mit char* sparen und gleich ganz einfach std::string verwenden:
1 | #include <string> |
2 | #include <iostream> |
3 | |
4 | int main () { |
5 | std::string fp1; // String anlegen |
6 | fp1 = "zulaessig"; // String zuweisen |
7 | std::cout << fp1; // String ausgeben |
8 | } // Löschung erfolgt automatisch |
Hier noch mal Schritt für Schritt: Kaffeetasse schrieb: > char *fp1; Ok, fp1 ist also ein Zeiger. Er enthält die Adresse eines char. > fp1 = new char [255]; Hier erzeugst du dynamisch ein Array aus 255 chars und läßt fp1 auf den Anfang zeigen. Du schreibst also die von new zurückgegebene Adresse in fp1. > fp1="zulaessig!\n"; Ups, was ist denn das? Hier überschreibst du die gerade nach fp1 geschriebene Adresse wieder durch eine andere, nämlich durch die der Stringkonstante "zulaessig!\n". fp1 zeigt also nun auf eine andere Speicherstelle. Das Ergebnis von new ist nun für immer verloren, da du die Adresse nirgends mehr hast. > delete[] fp1; Hier übergibst du nun diese Adresse der Stringkonstante, die jetzt in fp1 steht, an delete[]. Die hat nichts mehr mit der von new zurückgegebenen Adresse zu tun, und deshalb kracht es. > Beim Start bekomme ich die Fehlermeldung im Anhang. Kann mir jemand > sagen wo mein Fehler bei der Verwendung von der "delete"-Funktion liegt? delete ist keine Funktion, sondern ein Operator. Und wie Dr.Sommer schon schreibt, tu dir einen Gefallen und nutze die String-Klasse statt "rohe" Zeiger auf char. Diese sind sehr fehleranfällig und unkomfortabel.
Der Vollständigkeit halber noch die Lösung für C: Wenn du den Speicher unbedingt mit New anlegen willst, bekommst du deinen Text da nur mit strcpy hinein. Oliver
Oliver S. schrieb: > Der Vollständigkeit halber noch die Lösung für C: Wenn du den Speicher > unbedingt mit New anlegen willst Nur dass es in C kein "new" gibt... Nur malloc
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.