Eigene Stringklasse verursacht einen Absturz
-
Hallo, ich habe mir zur Übung einen eigene Stringklasse programmiert.
Heute habe ich festgestellt das es da einen Fehler gibt.
Das Programm stürzt nicht ab wenn ich einen String in der Funktion main() erstellen. Aber es stürzt ab wenn dich den Stirng in einer Funktion erstelle???
hier mal etwas Code.
parsx::parsx(const char* string) { cpychar(string); }
// // Kopiert str in m_string // void parsx::cpychar(const char* str) { m_string=new char[len(str)+1]; m_counter = 0; while(str[m_counter]) { m_string[m_counter]=str[m_counter]; m_counter++; } m_string[m_counter]='\0'; }
-
h² schrieb:
void parsx::cpychar(const char* str) { m_string = new char[len (str)+1]; m_counter = 0; while(str[m_counter]) { m_string[m_counter] = str[m_counter]; m_counter++; } m_string[m_counter]='\0'; }
Sieht zwar umständlich, aber korrekt aus. Kann es sein, daß len() etwas falsches zurückgibt?
Außerdem würde ich die strlen()-Funktion aus <cstring> verwenden, die sollte wesentlich schneller sein.Moritz
-
Hallo audacia, ich könnte schon fertige Funktionen nutzen, aber ich wollte das selber realisieren.
Ich bekomme ja auch keinen Fehler in der Funktion. Die Funktione arbeitet richtig solange diese in der main() Funktion ist oder Global.
Sobal diese in einer anderen Funktion erstellt wird stürzt das Programm ab.
Kann es daran liegen das es einmal auf dem Heap und einmal auf dem Stack erstellt wird???
-
h² schrieb:
Kann es daran liegen das es einmal auf dem Heap und einmal auf dem Stack erstellt wird???
Meinst du deinen String? Der wird immer auf dem Heap erstellt, da du ihn dynamisch allozierst.
Zeig mehr Code!
-
Naja der Code ist sehr Umfangreich. Und ich wüsste jetzt nicht welchen Teil ich posten soll ???
Aber die Fehlermeldung des VC++ lautet.
DAMAGE: after Normal block(#45) at 0x00871780
-
Da hast du dich wohl verproggt.
-
Der Fehler ist im Destruktor.
parsx::~parsx() { if(m_string) delete[] m_string; }
Hier stürzt er ab.
Was mir nicht ein den Sinn gehen will ist das
int main() { parsx wort="Hallo, Welt"; return 0; }
geht ohne Probleme.
void Funktion(void); int main() { Funktion(); return 0; } void Funktion(void) { parsx wort="Hallo, Welt"; }
Verursacht einen Fehler.
-
Hallo Leute,
was haltet ihr davon, dem Problem schlicht mit dem Debugger zuleibe zurücken? Der sagt einem doch alles, dauert aber ein bissschen.
Gruss Jerry
-
Minimales, compilierbares Beispiel erstellen.
-
Hallo, während ich schrieb, ist von die neuer input gekommen:
if (m_string) delete[] m_string;
delete [] bezieht sich nur auf Arrays!!
Gruss Jerry
-
m_string ist doch ein Array!!!
-
Die String-Klasse ist doch wohl eher bei den Containern zu suchen, oder? Da muss ich aber nachgucken. Jedenfalls ist ein string kein Array!
Gruss Jerry :p
-
ein char-Array ist ein Array
-
h² schrieb:
Der Fehler ist im Destruktor.
parsx::~parsx() { if(m_string) delete[] m_string; }
Hier stürzt er ab.
1. brauchst du m_string nicht auf NULL zu überprüfen; du kannst an delete/delete[] gefahrlos einen Nullzeiger übergeben.
2. könnte es sein, daß m_string im Konstruktor nicht auf NULL gesetzt wird?
3. auch, wenn du einen neuen String hineinkopierst (wie in der cpychar-Methode) solltest du den ggf. vorhandenen alten String zunächst delete[]n.Trotzdem: erstelle ein lauffähiges Minimalbeispiel, indem du alle Funktionen, in die mit dem Problem nicht unmittelbar zusammenhängen, rausschmeißt; das kannst du dann ja hier posten.
Moritz
-
undef schrieb:
ein char-Array ist ein Array
Da sind wir beide auf die Nase gefallen. Die Definition ist:
const char* string
ist also ein Zeiger auf eine konstante Zeichenkette. Delete darf aber nur im Zusammenhang mit new angewendet werden! Das dürfte die Lösung sein!!
Nix für ungut.
Gruss Jerry
-
er hat doch:
m_string = new char[len (str)+1];
-
dumm????? schrieb:
er hat doch:
m_string = new char[len (str)+1];
Nein, nein, ich habs selbst gemerkt. Alzheimer lässt grüssen. Sorry.
-
dumm????? schrieb:
er hat doch:
m_string = new char[len (str)+1];
Nein, nein, ich habs selbst gemerkt. Alzheimer lässt grüssen. Sorry.