"delete" - Fehlermeldung - Speicher freigeben C++

Gast #3628672
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.
Angehängte Dateien:
Gast #3628685
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
Gast #3628712
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren