Forum: PC-Programmierung "delete" - Fehlermeldung - Speicher freigeben C++


von Kaffeetasse (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.