löschen einer Localen Variable.
-
Hallo,
Ich habe eine Variable local initialisiert.
char* Dir="C:\";
danach strcat(Dir,BA.c_str()); den Inhalt so erweitert.
Am Ende sodelete Dir;
Speicher Freigegeben.wenn ich mein unterprogramm nochmal aufrufe, wird Dir nicht mit "C:\" initialisiert, sondern "c:\" + alte Inhat von "BA".wie kann ich diese Fehler beseitigen?
gibt es unterschied zwichen: char* Dir; und char *Dir; ?
Gruß
S.Mathi

-
Autsch, böse Falle.
char* Dir ist ein Zeiger auf einen Speicherbereich und in deinem Falle auf den Speicherbereich deines Programmes wo 'c:\' drin steht. Durch strcat(Dir,BA.c_str()); überschreibst du dir jetzt einen Teil des Speichers. Welcher Teil dies ist und was das für Auswirkungen hat, kann keiner Vorhersagen. Fakt ist, das dies die beste Methode ist um die irrwitzigsten Fehler zu erzeugen. Angefangen von undefinierten Verhalten bis hin zu Programmabstürzen; meistens an Stellen die rein gar nix mit der Programmzeile zu tun haben.
Warum beim zweiten Durchlauf Dir nicht mit 'c:\' sondern mit "c:\" + alte Inhat von "BA" initialisiert wird ist einfach zu erklären. Erstens wir char* Dir nicht mit der Zeichenkette initialisiert sondern mit der Adresse, an der die Zeichenkette steht und zweitens hast du wie gesagt beim ersten Durchlauf dein Programmcode modifiziert. Dir zeigt auf den richtigen Speicherbereich nur steht da jetzt was anderes drin als vorher.
Der zweite Fehler ist, das du versuchst den Speicher auch noch zu löschen (delete *Dir;). Deleted werden nur Sachen, die vorher auch mit new erzeugt wurden und nicht prinzipiell alles, was nach Zeigern aussieht.
Eine (nicht optimale) Lösung wäre:
char *dir = new char[strlen(BA.c_str())+4]; // Platz für 'c:\\' (drei Stellen), BA und das abschließende Null-Byte sprintf(dir,"c:\\%s",BA.c_str()); bzw. strcpy(dir,"c:\\"); strcat(dir,BA.c_str()); ... delete dir;Da wir aber im BCB-Forum sind, C-Style in C++ nicht gern gesehen wird und BA anscheinend ein AnsiString ist, würde ich doch folgende Variante vorschlagen:
AnsiString Dir = AnsiString("c:\\") + BA;
-
Vielen Danke für Ihrer ausführlichen Erklärung.Ich habe noch kleine Frage:
Wofür ist %S da?

-
s für string ?
-
push_ schrieb:
s für string ?
Super! Sie haben meine 2 Probleme mit einer Änderung gelöst.
Vielen Danke.

Grüß
S.Mathi