Debug/Release-Problem mit CString
-
Mein Problem ist sehr merkwürdig und ich bin echt am verzweifeln. Habe jetzt ein weiteres CDialog-basiertes Projekt angefangen, welches auch die GDI+ benutzt.
Die Debug-EXE läuft problemlos, jedoch macht mir die Release-EXE nur Probleme. Dabei geht es um die lokalen CString-Objekte die das Release immer zum Absturz bringen. Beispiel:
void MyDialogDlg::OnLoadButton() { CString str("Tileset"); // ... }
Nun, der Witz ist, das es nicht immer beim ersten Aufruf der Methode abstürzen muß. Ich habe in meiner Klasse mehrere Methoden in denen ich lokale CString-Objekte erzeuge. Mind. beim zweiten Aufruf einer der Methoden, knallt es mit einer Speicherlese-Verletzung (kein Null-Pointer, es ist eine größere Adresse!).
Entferne ich jedoch die lokalen CString-Objekte, gibt es keinen Absturz im Release.
Alles andere funktioniert, auch das erzeugen von CStrings per "new CString()" funktioniert wunderbar. Ich kann mir das einfach nicht erklären.Weiß jemand woran das liegt?
-
versuch doch mal ohne den Constructor aufruf.
CString str;
str = "Tileset";devil
-
Hab ich auch schon ausprobiert.
Was mir ebend noch aufgefallen ist: habe ich ein CString-Member in der Klasse, und in einer anderen Klasse wird ein lokales CString erzeugt, bekommt das CString-Member (welches in einer anderen Klasse ist) ebenfalls den Wert des anderen Lokalen CStrings. Sowohl im Debug als auch im Release.
Jetzt bin ich dabei alles auf char* umzustellen. Mich würde jedoch trotzdem der Grund für dieses verrückte Phenomen interessieren.
-
Da du das Projekt, wie Du sagst, erst angefangen hast, wäre es denke ich ganz gut, Du stellst es mal zur Verfügung!
-
So wie du das Beschreibst macht es den Eindruck das du irgenwo in denem Programm auf speicher zugreifst und änderst auf dem Programmcode liegt. Versuche doch mal vor
CString str("Tileset");
ein parr weitere befehle sodas sich endqültige Quellcode endert!
Sollte der absturz dann nichtmehr sein oder andere Abstürze kommen kannst du dir da zuimmlich sicher sein!
-
Ich hab mal irgenwo läuten hören, daß bei CString-Debug der Index auf
den zugegriffen wird überprüft wird und bei der Release nicht.
Vieleicht greift er,wie ldr... schon sagte, ohne Kontrolle auf Speicherbereiche zu, die nicht empfehlenswert sind.
-
Hi,
der Unterschied zwischen einem Debug- und einem Release-Build liegt darin, dass im Debug-Build bei Variablen auf dem Stack jeweils 1 "Guard-Byte" vor und hinter dem Speicherbereich gesetzt werden. Ein CString-Objekt ist nicht unbedingt Null-terminiert. Außerdem liefert die Funktion CString::GetLength() die Länge ohne Null-Terminator. Dadurch kann es zu Speicherzugriff auf eben genau das Guard-Byte hinter dem Objekt kommen. Die Debug-Version läuft dann noch, der Release hängt sich auf.
Allerdings solltest Du wohl besser mal etwas Quellcode posten, das macht die Fehlersuche einfacher.