Visual C++ 2005 Compiler buggy !?



  • Guten Tag die Herren und Damenschaften.
    Ich habe mir neulich VC++ 2005 Express Ed. von MS gezogen, und mal eine einfache LinkedList programmiert, und bekomme in meiner erase(int i) Methode nen Problem:
    😕

    void Liste::erase(int i)
    {
    Node* temp = pAnfang; //pAnfang ist der Head-Node der Liste
    Node* prev = pAnfang;
    
    while (temp != 0)
    {
    	if (temp->wert == i)  //Hier will VC++2005 nicht
    	{
    		if (temp == pAnfang)
    		{
    			Node* dead = temp;
    			pAnfang = temp->pNext;
    			dead->pNext = 0;
    			delete dead;
    			dead = 0;
    		}
    		else
    		{
    			Node* dead = temp;
    			prev->pNext = temp->pNext;
    			dead->pNext = 0;
    			delete dead;
    			dead = 0;
    		}
    	}
    	prev = temp;
    	temp = temp->pNext;
    }
    }
    

    Der Witz an dem Code ist, daß er sich mit dem gcc(mingw) unter Code:blocks problemlos und ohne Warnungen (-pedantic -Wall) compilen&ausführen lässt, und auch macht was ich will. Wenn ich den selben Code unter VC++ 2005 E.E. compile gibt es kein Fehler, erst wenn ich zur Laufzeit ein Element per erase(int i) Funktion löschen will. So wie es aussieht (laut dem Debugger) ist der Pointer an der Stelle "if (temp->wert == i)" mit irgendeiner Mülladresse belegt. Ist irgendwas bekannt, daß der MS Compiler einfach die Adressen von Pointer "vergisst", oder ist da irgendein Problem mit meinem Code?
    Irgendwie erscheint mir der Compiler nicht ganz ISO konform zu 😮



  • I.d.R. hilft debuggen...



  • (1) Du bist zu 99.9% auf der falschen Spur. Ich habe hunderte von "Compiler bug?!" - Posts gesehen, und da war bisher kein einziger dabei. Andererseits gibt es genug Gründe, warum der Code auf einem Compiler läuft und dem anderen nicht, und es ist trotzdem deine Schuld.

    (2) was heißt "VC will nicht"? (also bitte...)

    (3)

    if (temp == pAnfang)
            {
                Node* dead = temp;
                pAnfang = temp->pNext;
                dead->pNext = 0;
                delete dead;  // hier wird auch temp ungültig
                dead = 0;
            }
           [...]
          prev = temp; // bingo!
          temp = temp->pNext; // doppelbingo!
    

    das gleiche passiert im else-Zweig.



  • peterchen schrieb:

    (1) Du bist zu 99.9% auf der falschen Spur. Ich habe hunderte von "Compiler bug?!" - Posts gesehen, und da war bisher kein einziger dabei.

    Das gilt leider nur, solange der Compiler nicht von Borland kommt ;). Aber grundsätzlich hast du vollkommen recht.



  • C/C++ Code:
         if (temp == pAnfang)
            {
                Node* dead = temp;
                pAnfang = temp->pNext;
                dead->pNext = 0;
                delete dead;  // hier wird auch temp ungültig
                dead = 0;
            }
           [...]
          prev = temp; // bingo!
          temp = temp->pNext; // doppelbingo!
    

    @peterchen: Danke. Habe jetzt ein break eingebaut (nach dead=0), und bei //bingo und //doppelbingo die Zuweisungen auskommentiert, und nun funktioniert es. Naja, eigentlich wollte ich noch eine eraseAll(int) einbauen, da werde ich das bei
    //bingo und
    //doppelbingo
    allerdings benötigen, da die eraseAll(int) alle vorkommenden Zahlen löschen soll.
    Dennoch ist es eigenartig, daß die ganze Sache unter gcc einwandfrei läuft.

    Gute Nacht


Anmelden zum Antworten