Verstehe nicht wie diese Klasse funktioniert
-
nicht sizeof, sondern strlen(string) + 1 zeichen für '\0'.
Und keine Unterstriche als Beginn für Variablennamen verwenden!
-
Und wo soll ich den Speicher wieder freigebe? Ich habe schon so vieles ausprobiert. Auch im destruktor habe ich versucht mit delete Speicher freizugeben. Doch dann stürztz das Programm ab.
-
Ah und das funktioniert auch nicht so wie oben mit new.
string f() { char test[]="Hallo"; string result(test); return result; }
-
Du musst zwischen Kopierkonstruktor und Zuweisungsoperator unterscheiden.
Zuerst Speicher von der richtigen Größe anfordern (new char[size]),
dann den string kopieren (strcpy(m_string, string)) und beim Zuweisungsoperator eben zuerst den alten string mittels delete [] löschen.
Im Destruktor dann einfach mit delete [] löschen.
Poste Code, dann sagen wir dir, was genau nicht funktioniert.
-
davie schrieb:
beim Zuweisungsoperator eben zuerst den alten string mittels delete [] löschen.
...zuallererst aber auf selbstzuweisung prüfen.
-
Jetzt geht es langsam voran.
string f() { char test[]="Hallo"; string result(test); return result; } string str=f(); . . .
Das geht jetzt.
So sehe die Konstruktoren aus:
string::string ():_string(0){_string = new char[];} string::string (char* t) { int l; l=len(t)+1; _string=new char[l]; l=0; while(t[l]) { _string[l]=t[l]; l++; } _string[l]='\0'; }
Das sind die überladenen Operatoren:
string operator=(char* t) { if(_string) delete[] _string; int l; l=len(t)+1; // len() ist eine eigene Funktion!!! _string=new char[l]; l=0; while(t[l]) { _string[l]=t[l]; l++; } _string[l]='\0'; return *this; } string operator=(string& st) { if(_string) delete[] _string; char* t=st._char(); int l; l=len(t)+1; _string=new char[l]; l=0; while(t[l]) { _string[l]=t[l]; l++; } _string[l]='\0'; return *this; }
Jetzt habe ich ein Problem beim Destruktor stürzt das Programm ab. bzw. das OS meldet sich zu Wort.
string::~string() { if(_string) delete[] _string; }
Ich weiss man soll keine Variablem mit einem Unterstrich beginnen. Aber alles nur zu Übung
Ich bin trotzdem für jeden Verbesserungshinweis dankbar.PS:
Das sind noch Methoden die oben verwendet werde.// Zeiger auf char zurück geben char* string::_char(void){ return _string;}
// Länge des Strings int string::len(){ int l=0; while (_string[l]){l++;} return l;} // Länge des Strings int string::len(char* s){ int l=0; while (s[l]){l++;} return l;}
Ich hoffe das war jetzt nicht zu viel
-
-
Und was kommt für eine Meldung beim Destruktor? Der selbst sieht richtig aus.
Code-Hacker
-
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
-
Ich konnte den Fehler lokalisieren.
Er liegt im diesem überladenen Operator:
string operator=(string st) { if(_string) delete[] _string; char* t=st._char();//char aus string holen! int l; l=len(t)+1;//Laenge von t _string=new char[l]; l=0; while(t[l]) { _string[l]=t[l]; l++; } _string[l]='\0'; return *this; }
Ich weiss nur nich wo genau