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.


Anmelden zum Antworten