Zugriffsverletzung auf frendem PC jedoch nicht auf dem eigenen
-
Hallo,
Ich habe folgendes Problem und zwar habe ich ein Progi geschrieben, welches bei mir einwandfrei funktioniert, jedoch nicht bei meinem Kollgen, der allerdings die selbe BCB Version (6.0) verwendet wie ich. Hier mal etwas Code:while(!fertig){ ... cout << "Geben Sie die Zahl ein: (q zum Beenden) "; //String einlesen cin >> FloatString; if(Number) //Wenn Speicher reserviert { delete [] Number; //Speicher freigeben Number = NULL; } else; Number = new char[FloatString.length()]; //Speicher neu reservieren Number = FloatString.c_str(); pNumber = &Number[0]; ch = *pNumber++; ... }dieser teil sollte ausreichen. Das Problem ist nun folgendes, wie gesagt, bei mir funzt und beim Kollgen erhält er beim zweiten Schleifendurchlauf eine Zugriffsverletzung bei Adresse blablabla und der Debugger zeigt auf folgende Zeile:
delete [] Number; //Speicher freigebenHat jemand eine Ahung, woran das liegen könnte?
-
Hallo
was für einen Typ genau hat denn Number?
Und außerdem vermischt du C, C++ und VCL in schlimmer Weise.
Ich empfehle dir eine reine Konsolen-C++ Lösung mit std::string und stringstream.
Also sachau mal ins C++ Forum.bis bald
akari
-
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++;