Zugriffsverletzung auf frendem PC jedoch nicht auf dem eigenen
-
Number ist vom Typ char* und FloatString ist vom Typ string.
wo vermische ich hier C,C++ und VCL?
-
Hallo
ich war wegen FloatString.c_str() und weil der Thread im BCB-Forum ist der Auffassung, das FloatString ein AnsiString ist. Aber so sieht das doch schon anders aus.
Ich frage mich allerdings, wozu du diesen *char ** brauchst. std::string bietet doch ebenfalls Zugriff auf die einzelen chars.
Ich bin mir auch nicht sicher, ob *char ** wirklich mit delete [] gelöscht werden dürfen.bis bald
akari
-
den char* benötige ich, weil dies die Aufgabenstellung des Dozenten war. Wir müssen als Übung eine Statemachine Programmieren, welche ein Char-Array in ein Float umrechnet. Den String brauche ich bloss bei der Eingabe, um das Programm zu testen und da unser netter Dozent sicherlich das Programm auf Herz und Nieren test, beuge ich so einem allfälligen overflow vor, wie er auftretten könnte wenn ich direkt in das Char Array einlese.
Ich dachte, wenn ich Speicherplatz mit new [] reserviere muss ich ihn anschliessend auch mit delete [] wieder freigeben.
-
Hallo
dein Problem ist die fehlerhafte Kopieraktion :
Number = new char[FloatString.length()]; //Speicher neu reservieren Number = FloatString.c_str(); // Speicher wird aufgegeben und Zeiger auf neuen Wert gesetztso muß es (meiner Meinung nach) richtig aussehen :
Number = new char(FloatString.length()); strcat(Number, FloatString.c_str()); // So wird der Inhalt von C-Strings kopiert ... // Number benutzen delete Number;Allerdings benutze ich schon lange keine reinen C-Strings mehr (du siehst warum).
Das Thema ist wohl im C++ Forum besser aufgehoben.bis bald
akari
-
@akari
Das ist noch nicht ganz korrekt. Da fehlt noch der Platz für das '\0' und die Klammer ist falsch (char hat keinen Konstruktor).
alsoNumber = new char[FloatString.length()+1]; strcpy(Number, FloatString.c_str()); // So wird der Inhalt von C-Strings kopiert ... // Number benutzen delete[] Number;Ich dachte, wenn ich Speicherplatz mit new [] reserviere muss ich ihn anschliessend auch mit delete [] wieder freigeben.
Das ist auch richtig so.
-
akari schrieb:
Ich bin mir auch nicht sicher, ob *char ** wirklich mit delete [] gelöscht werden dürfen.
generell ist alles was mit new [] erstellt wurde auch mit delete [] zu löschen!
-
@Braunstein: Ausserdem empfiehlt sich die Verwendung von strncpy und das komplette Streichen von strcpy aus dem Gedächnis.
-junix
-
Prinzipiell ist das natürlich richtig. In diesem Fall kann allerdings nichts passieren, da die Länge des String ja bekannt ist.
-
Klar. Nur wer weiss, welche Mutationen noch in den Code kommen? (o;
-junix
-
Ok, so funktionierte es. Hab allerdings noch ne kleine Frage und zwar hab ich festgestellt, dass bei strncpy das CharArray nicht terminiert wird
mach ich das etwas falsch, oder ist das wirklich so?
Deshalb habe ich es jetzt so gelöst.cin >> FloatString; if(Number) { delete [] Number; Number = NULL; } else; Number = new char[FloatString.length()+1]; strncpy(Number, FloatString.c_str(),FloatString.length()); Number[FloatString.length()] = '\0'; pNumber = &Number[0]; ch = *pNumber++;