Problem mit basic_string vector!!! HILFE!
-
Außerdem ist das Beispiel ist fehlerhaft. Man darf doch nicht einfach mit free den Speicher eines std::strings freigeben.
-
hat der string von myotherfunction als letztes zeichen ein \0? ist das worauf der rückgabewert der funktion zeigt überhaupt noch existent wenn das programm aus myOtherFunc rausspringt? da mir ein delete[] fehlt denk ich schonmal, dass es nicht auf dem heap liegt->schau nochmal nach, ob dein char array nicht schon irgendwo zerstört wurde.
//edit und dass du eher c als c++ schreibst, sollte dir wohl klar sein, oder?
-
otze schrieb:
hat der string von myotherfunction als letztes zeichen ein \0? ist das worauf der rückgabewert der funktion zeigt überhaupt noch existent wenn das programm aus myOtherFunc rausspringt? da mir ein delete[] fehlt denk ich schonmal, dass es nicht auf dem heap liegt->schau nochmal nach, ob dein char array nicht schon irgendwo zerstört wurde.
Wenn da kein \0 wäre, dann könnte ich den String auch nicht ausgeben, erst recht nicht direkt wenn ich die Funktion myOtherFunc() aufgerufen habe, und ich kann ja auch sowas machen wie
char* test = myOtherFunc(); printf("%s\n", test); //<- Ausgabe völlig OK! return test; // <- Exception!
otze schrieb:
//edit und dass du eher c als c++ schreibst, sollte dir wohl klar sein, oder?
Das ist mir völlig klar.
Ich programmiere zwar C, benutze jedoch die basic_string Vektoren weil die halt sehr dynamisch und anpassungsfähig sind. Aber bzgl. dieses Problems bin ich doch bei C++ richtig!Gruss,
code_pilot
-
unreg schrieb:
Außerdem ist das Beispiel ist fehlerhaft. Man darf doch nicht einfach mit free den Speicher eines std::strings freigeben.
Ich mache ein free() auf das char*, nicht auf string. Lies mal den Code genauer.
-
Lies du deinen Code mal lieber genauer. Du übergibst letText den internen Speicherbereich einer Variable vom Typ string und löschst ihn da. Das kann nicht gut gehen. Weiterhin kann ich unreg nur zustimmen. Die meisten deiner casts sind völlig unnötig.
z.Bsp. hier:
statt void* gText = (void*)NULL; void* Text = NULL;
oder
(void)strcpy((char*)gText, text);
usw.[edit]Alles zurück. Ich hab mich da wohl verlesen.[/edit]
-
mach doch mal einfacher:
string gText; void letText(const std::string &text) { gText = text; } const string &getTextValue() { return gText; }
-
Braunstein schrieb:
Lies du deinen Code mal lieber genauer. Du übergibst letText den internen Speicherbereich einer Variable vom Typ string und löschst ihn da. Das kann nicht gut gehen. Weiterhin kann ich unreg nur zustimmen. Die meisten deiner casts sind völlig unnötig.
z.Bsp. hier:
statt void* gText = (void*)NULL; void* Text = NULL;
oder
(void)strcpy((char*)gText, text);
usw.Bin ich blind? Wo wird das im o. Code gemacht? Es wird 'gText' geloescht und neu
dafuer Speicher reserviert. Dann wird der Inhalt von 'text' in 'gText' _kopiert_.mfg
v R
-
Ok hast Recht.
Aber das hier:void* getText() { if(gText == (void*)NULL) return (char*)""; return gText; }
müsste doch Schwierigkeiten machen wenn gText NULL ist. Immerhin gibt er hier einen Pointer auf ein lokales konstantes Stringliteral zurück. Oder wird bei einem Leerstring ein NULL-Pointer übergeben?
-
Braunstein schrieb:
Ok hast Recht.
Aber das hier:void* getText() { if(gText == (void*)NULL) return (char*)""; return gText; }
müsste doch Schwierigkeiten machen wenn gText NULL ist. Immerhin gibt er hier einen Pointer auf ein lokales konstantes Stringliteral zurück. Oder wird bei einem Leerstring ein NULL-Pointer übergeben?
stringliterale existieren auch nach dem verlassen einer funktion. das verursacht hier also keine probleme.
-
Hallo!
Hmmm ich bin dem Problem etwas näher gekommen: Es sieht so aus, als ob der String-Vector ganz einfach sich Speicher reserviert, der schon einem anderen Pointer "gehört". Ich weis auch nicht WIE der da hinkommt, nur steht bei mir in einem völlig anderem char-Pointer (nich im obigen Beispiel erkennbar!) auf einmal genau 600 Byte aus dem Text (3560 Byte insgesamt, es werden aber nur 2960 Byte verwendet, der Rest steht auf einmal da wo er nicht stehen soll!!!).
Dazu sei noch zu sagen, dass ich genau 3560 + 1 Byte zuvor für diesen Text reserviere, und in dann mit strcpy() in den Speicher reinschreibe...
Ich verwende zur Allokierung immer malloc(). Liegt's vielleicht daran?
Und wenn ich versuche, meine "myOtherFunc()" als static void* zu deklarieren, meckern mein Compiler rum, er würde die Funktion nirgendwo finden.Warscheinlich weil sie dann static ist.
Aber das kann's ja auch nicht sein.
Gruss,
cp
-
ssm schrieb:
string gText; void letText(const std::string &text) { gText = text; } const string &getTextValue() { return gText; }
Was bezweckt denn das genau??
Weil der C++Builder bisher nie gemecker hat. Brauche ich evtl auch dieses "namespace std;" ??Aber ich denke mal nicht das es daran liegen wird.
Gruss,
~code_pilot
-
code_pilot schrieb:
Was bezweckt denn das genau??
Weil der C++Builder bisher nie gemecker hat. Brauche ich evtl auch dieses "namespace std;" ??[cpp]
**#include <string>
using std::string;**
string gText;
void letText(const string &text)
{
gText = text;
}const string &getTextValue()
{
return gText;
} [/cpp]
-
jo wie gesagt: Es bringt nix
.
-
code_pilot schrieb:
jo wie gesagt: Es bringt nix
.
Fehler?
-
hast du schon mal versucht, die exception abzufangen, um herauszubekommen, worum es sich handelt? durch einsatz eines debuggers kommt man dem problem in der regel auch auf die spur, wenn es reproduzierbar ist.
-
wenn du auf C++ schreiben will, wieso nicht einfach so:
#include <string> #include <iostream> #include <fstream> std::string gText; void letText(const std::string &text) { gText = text; } const std::string &getTextValue() { return gText; } int main(int argc, char* argv[]) { std::ifstream is("absturz.txt"); std::string line; while(is && std::getline(is, line)) { letText(line); std::cout << getTextValue(); //getch(); } }
für CBuilder gibt's eigentlich ein anderes Forum
-
camper schrieb:
hast du schon mal versucht, die exception abzufangen, um herauszubekommen, worum es sich handelt? durch einsatz eines debuggers kommt man dem problem in der regel auch auf die spur, wenn es reproduzierbar ist.
@camper: Jaha und das hab ich doch auch schon oben beschrieben: Es wird einfach ein Speicherbereich überschrieben der eigentlich gar nicht überschrieben werden darf!!!! Siehe oben, die Sache mit den 600 Bytes.
@ssm: Jaha, ein C++ Builder Forum für VCL, mein Programm hat aber mit VCL gar nichts am Hut. :p
-
WOFF!!
Nach 1 Monat intensiver Programmierung und Debugging (ich habe mein komplettes Prog jetzt als reines C-Programm OHNE string-Objekte re-implementiert) bin ich diesem blöden Fehler jetzt endlich auf die Schliche gekommen: Man allokiere einen Speicherbereich von der Größe einer Datei, mappe diese Datei da rein, und schreibe an das Ende des Speicherbereichs PLUS 1 noch einen Nullterminierer! Voila, schon hat man das perfekte Speicherleck, das irgendwann zahlreiche Operationen, allokationen etc. später zu einem Lesefehler führt! Nur weil meine doofe Einleseschleife nicht korrekt war, habe ich jetzt meine halbe Software neu geschrieben!
Naja, was solls, jetzt ist sie auf jedenfall auch performanter ;).
Grüsse,
code_pilot