mueslirocker
Mitglied
Hallo,
vorweg - ich benutze cygwin und damit den GNU Compiler gcc.
Also, ich hantiere momentan mit sehr großen Strings.
Hab mir eine Klasse dafür geschrieben, die einen Pointer auf einen Char (anfangs NULL) und ein Integer, der die Füllhöhe des Strings speichert, als Member hat. Da ist noch mehr in der Klasse (wie z.B. ein kleiner String statischer Größe, der den Namen des Strings beinhaltet und sowas), aber ich denke mal, das ist hier nicht wichtig.
Im Konstruktor kann man angeben, wie groß der String sein soll.
Mittels malloc suche ich mir dann einen entsprechenden Speicherbereich und lass den Pointer drauf zeigen.
Diese Buffer-Klasse brauche ich öfters.
Ich speichere in dessen Instanzen einen sehr langen String (bis zu 3 MB).
Nebenher lege ich noch 3 Buffer an, die genauso groß sind (einer soll den veränderten String beinhalten und zwei brauche ich als Zwischenspeicher, um Berechnungen an Teilen des Strings durchzuführen).
Mir fällt grad noch ein vierter ein, der einen Verbose-String beinhalten soll.
Und von diesen langen Strings werden werden mehrere pro Programmdurchlauf (wenn auch nacheinander) manipuliert.
Am Ende eines "String-Handlings" wende ich free() auf den char Pointer (nicht auf das Objekt selbst) an.
Also in etwa "free(BufferInstanz->charbuffer);"
Okay, mein Problem ist, dass nach dem dritten oder vierten String-Handling das Programm beim Instanzieren mit Fehlermeldung "xy.exe hat einen Fehler verursacht und wird geschlossen. Starten sie das Programm neu. Ein Fehlerprotokoll wird erstellt" abbricht (btw, ich hatte einen Stackdump oder sowas erwartet, aber ich finde keinerlei Fehlerprotokoll).
Durch Testausgaben habe ich festgestellt, dass genau der malloc Befehl im Konstruktor die Absprungstelle ist.
Wenn ich das Programm geringfügig ändere (die Strings in anderer Reihenfolge behandle oder einen weglasse o.ä.), tritt der Fehler manchmal einen Durchlauf früher oder später auf.. manchmal sogar gar nicht.
Für mich klingt das so, als würde irgendwo ein Speicher überlaufen.
Meine Fragen:
Hat jemand Erfahrungen mit malloc diesbezüglich?
Darf ich malloc überhaupt im Konstruktor der Klasse benutzen?
Muss ich Speicher noch irgendwie anders reservieren oder ander wieder freigeben?
Kann es sein, dass ich einfach zu viel Speicher insgesamt reservieren will? Falls ja, warum klappt es bei den ersten paar Durchläufen und auf
einmal nicht mehr?
Muss ich das free() auf den char Pointer in dem Objekt oder auf das Objekt selbst anwenden?
Das Objekt erzeuge ich mit dem new Operator.
Sollte ich den Pointer mit free() und danach das Objekt mit delete freigeben?
Wo könnte sonst mein Problem liegen?
/edit
Man sieht vielleicht, dass ich nicht so viel mit Speicherzuweisungen am Hut habe.
Ich lese immer wieder von memset.
Was hat es damit auf sich?
Über Links auf Manuals o.ä. würde ich mich auch freuen.
Ich hab zu malloc noch nichts tiefergehendes gefunden.
Achso, nochwas - malloc soll einen NULL Pointer liefern, falls der Speicher nicht reserviert werden kann.
Das wollte ich prüfen, aber da bei der malloc Funktion selbst der Absturz kam, weiß ich leider nicht, was zurück gegeben werden würde.
vorweg - ich benutze cygwin und damit den GNU Compiler gcc.
Also, ich hantiere momentan mit sehr großen Strings.
Hab mir eine Klasse dafür geschrieben, die einen Pointer auf einen Char (anfangs NULL) und ein Integer, der die Füllhöhe des Strings speichert, als Member hat. Da ist noch mehr in der Klasse (wie z.B. ein kleiner String statischer Größe, der den Namen des Strings beinhaltet und sowas), aber ich denke mal, das ist hier nicht wichtig.
Im Konstruktor kann man angeben, wie groß der String sein soll.
Mittels malloc suche ich mir dann einen entsprechenden Speicherbereich und lass den Pointer drauf zeigen.
Diese Buffer-Klasse brauche ich öfters.
Ich speichere in dessen Instanzen einen sehr langen String (bis zu 3 MB).
Nebenher lege ich noch 3 Buffer an, die genauso groß sind (einer soll den veränderten String beinhalten und zwei brauche ich als Zwischenspeicher, um Berechnungen an Teilen des Strings durchzuführen).
Mir fällt grad noch ein vierter ein, der einen Verbose-String beinhalten soll.
Und von diesen langen Strings werden werden mehrere pro Programmdurchlauf (wenn auch nacheinander) manipuliert.
Am Ende eines "String-Handlings" wende ich free() auf den char Pointer (nicht auf das Objekt selbst) an.
Also in etwa "free(BufferInstanz->charbuffer);"
Okay, mein Problem ist, dass nach dem dritten oder vierten String-Handling das Programm beim Instanzieren mit Fehlermeldung "xy.exe hat einen Fehler verursacht und wird geschlossen. Starten sie das Programm neu. Ein Fehlerprotokoll wird erstellt" abbricht (btw, ich hatte einen Stackdump oder sowas erwartet, aber ich finde keinerlei Fehlerprotokoll).
Durch Testausgaben habe ich festgestellt, dass genau der malloc Befehl im Konstruktor die Absprungstelle ist.
Wenn ich das Programm geringfügig ändere (die Strings in anderer Reihenfolge behandle oder einen weglasse o.ä.), tritt der Fehler manchmal einen Durchlauf früher oder später auf.. manchmal sogar gar nicht.
Für mich klingt das so, als würde irgendwo ein Speicher überlaufen.
Meine Fragen:
Hat jemand Erfahrungen mit malloc diesbezüglich?
Darf ich malloc überhaupt im Konstruktor der Klasse benutzen?
Muss ich Speicher noch irgendwie anders reservieren oder ander wieder freigeben?
Kann es sein, dass ich einfach zu viel Speicher insgesamt reservieren will? Falls ja, warum klappt es bei den ersten paar Durchläufen und auf
einmal nicht mehr?
Muss ich das free() auf den char Pointer in dem Objekt oder auf das Objekt selbst anwenden?
Das Objekt erzeuge ich mit dem new Operator.
Sollte ich den Pointer mit free() und danach das Objekt mit delete freigeben?
Wo könnte sonst mein Problem liegen?
/edit
Man sieht vielleicht, dass ich nicht so viel mit Speicherzuweisungen am Hut habe.
Ich lese immer wieder von memset.
Was hat es damit auf sich?
Über Links auf Manuals o.ä. würde ich mich auch freuen.
Ich hab zu malloc noch nichts tiefergehendes gefunden.
Achso, nochwas - malloc soll einen NULL Pointer liefern, falls der Speicher nicht reserviert werden kann.
Das wollte ich prüfen, aber da bei der malloc Funktion selbst der Absturz kam, weiß ich leider nicht, was zurück gegeben werden würde.
Zuletzt bearbeitet: