Probleme mit delete (Base64 Coder ...Umfangreich)
-
So ein langer Code, der nicht kompilierbar ist, wird doch eh von kaum einem gelesen.
Benutz einen Debugger und am besten Valgrind.
Ein paar generelle Sachen:
* C als Anfangsbuchstaben von Klassennamen ist nicht schön
* if(a) delete a; ist überflüssig, da delete auch NULL-Pointer löschen kann (also intern wird schon auf NULL geprüft)
* ist dein Code teilweise im Bezug auf Exception Sicherheit problematisch (siehe gotw.ca/exceptional c++)
-
Kein schlechter Gedanke Knuddlbaer.
Haben wir im groben auch schon ausprobiert. Doch leider kann ich den Fehler nicht so leicht eingrenzen.
Nur so viel: Die eigentliche Umwandlung funktioniert 1 mal einwandfrei!
Nur in einer Schleife klappts halt nicht. Es hat definitiv mit den Deletes zu tun, da es läuft wenn man den Speicher NICHT frei gibt.Also kürzt sich der zu durchforstende Code eigentlich auf wenige Zeilen. Doch habe ich eben alles dazugepackt, um einen Zusammmenhang zu zeigen.
Ich versuche natürlich mal die Tipps, doch habe ich nicht al zu viel Hoffnung.
Ich denke wir haben uns schon zu sehr auf verschiedene Dinge eingeschossen.Kann ich irgendwie helfen, dass Ihr mir besser helfen könnt????
Wäre nett, wenn sich doch jemand die Mühe machen könnte, mal genauer reinzuschauen. Wir hängen einfach voll frustriert fest.
Danke!!
-
Ach ja:
Der Fehler hat mit der "GetDecoded()" zu tun. Denn ohne funktioniert die SPeicherfreigabe soweit einwandfrei.
Und zwar haben wir auch schon festgestellt, dass es wahrscheinlich am Delete der "source", "source2" oder "lookupTable" liegt.
Kommentiere ich diese aus, so funktioniert es wieder.
-
Einen Code, bei dem die Variablen m_source, m_source2 und m_quelle bzw. length und length2 heißen, will ich mir ehrlich gesagt nicht genauer anschauen. Die Probleme sind hausgemacht.
Ich würde dir raten, die ganzen Zeiger durch Vektoren zu ersetzen. resize statt new, sozusagen.
-
Danke!
Ich habe den Code zum grossen Teil übernommen. Und leider habe ich von Vektoren noch keinen Plan. Dachte nur Ihr könntet helfen.
Vielleicht findet sich ja noch einer, der ein wenig Nachsicht mit uns hat, zumal wir keine Programmierer sind.
Dafür sind wir doch gar nicht sooo schlecht, als dass man uns unsere Fehler ständig unter die Nase reiben muss.
Eine Lösung und dann Kritik ... DAS WÄRE COOL!!Danke!
-
Hallo,
Mir fällt z.Bsp. bei GetEncoded auf, dass du für den Fall length2>length bei m_source2 in nicht allozierten Speicher schreibst.
-
@Guenter Mies:
Du holst nirgendwo mit new Speicher für m_source, du kopierst nur den Zeiger von m_quelle. Daher darfst du auch m_source nicht mit delete freigeben.
Der Fall, den Braunstein beschreibt, tritt tatsächlich ein.
-
Ich würde vorschlagen es so zu machen, wie MFK vorschlägt. Schau Dir an wie std::vector funktioniert. Es gibt viele Beispiele hier im Forum (Suchfunktion!) und wenn Du was nicht verstehst frag nach. Dann ersetzt mal alles und Du wirst sehen: mit hohere Wahrscheinlichkeit funktioniert es dann schon.
btw.: den lookuptable würd ich eher als
char * lookuptable = "ABCDEF..."; machen. Da kannste auch reinindizieren. Und mach ihn static in die Klasse, dann mußte nicht bei jedem Funktionsaufruf frisch anlegen.
-
Danke für die Tipps!
Werde es mir die Tage nochmals genauer anschauen. Muss erstmal Abstand gewinnen und werde daher die Base64 Routine vorerst gegen etwas einfacheres ersetzen.
Aber so weit waren die Tipps schon sehr hilfreich.
Gruß
Günni
-
Du bist ja offenbar mit MSVC zu Gange. Weißt du, dass es da fertige Funktionen gibt?
Base64Decode und Base64Encode aus <atlenc.h>
-
[doppelt]
-
@ MFK
Gehört das es eine include für base64 gibt haben wir schon!
Nur leider gibt es diese Funktionalität (scheinbar) nicht auf eVC und genau da soll es laufen!atlenc.h ist diese header in der standardbiblothek won MSVC vorhanden? Offenbar nicht, sonst könnte ich sie ja einfach includieren, weißt du wo wir Sie herbekommen?
Mann könnte ja mal testen .. .. ..
Sven ( && Günni)
-
atlenc.h ist bei Visual Studio.NET 2003 dabei. Die Funktionen sind AFAIK inline, also könnte man sie direkt rauskopieren.
-
hmm haben leider kein .NET
???
sven