Absturz bei new



  • Dein Codefragment, welches den Fehler verursacht, wäre halt noch interessant...



  • streng dich doch ma bissl an 😉



  • Sieht so in etwa aus:

    function()
    {
      Line2d* line; //Hier die deklaration
    
      function(y); //Hier ist noch ein Methoden aufruf
    
      line = new Line2d(); //Funktioniert
      while (ei != NULL)
      {
        if (ei->edge != NULL)
        {
          line = new Line2d(); //Crash
        }
      }
    }
    

    Jetzt ist mir aufgefallen, wenn ich das Objekt vor der Schleife
    erfolgreich erzeugt habe, funktioniert auch das zweite.



    und [ /cpp]
    
    [cpp]
    function() 
    { 
    Line2d* line; //Hier die deklaration 
    
    function(y); //Hier ist noch ein Methoden aufruf 
    
    line = new Line2d (); //Funktioniert 
    while (ei != NULL) //was ist das? 
      { 
      if (ei->edge != NULL) //Was macht das dann?
        { 
          line = new Line2d(); //Crash
    //und was machst du mit dem "alten" objekt?
        } 
      } 
    }
    

    sag doch ma paar worte dazu...



  • Das mit den Schleifen könnt ihr vergessen an denen liegts nicht wieso auch sind ja nur überprüfungen.

    Also es muss irgendwie an der Funktion liegen, in der wird per memcpy etwas kopiert. Erzeugt wird darin am heap nichts.

    Hab mich vertan, wenn ich vor dem Funktionsaufruf new mache dann gehts.

    Also so

    function() 
    { 
    Line2d* line; //Hier die deklaration 
    
    line = new Line2d (); //Funktioniert
    
    function(y); //Hier ist noch ein Methoden aufruf 
    
    line = new Line2d (); //Funktioniert
    }
    

    Aber dieses hier Funktioniert nicht:

    function() 
    { 
    Line2d* line; //Hier die deklaration 
    
    function(y); //Hier ist noch ein Methoden aufruf 
    
    line = new Line2d (); //Funktioniert nicht
    }
    


  • test
    

    irgendwas machst du falsch - außerdem C++ -Tags sind besser als die Code-Tags...

    jz schreib halt endlich mal, was die jeweilige funktion macht und warum du so was machst:

    line = new Line2d (); //ok - versteh ich...
    
    function (y); //hat die nix mit line zu tun oder lässt du einfach alles relevante weg?
    
    line = new Line2d (); //und was ist mit dem alten objekt? delete is doof, oder? Oo
    

    bb



  • Meine Güte, dir zu helfen ist echt mühsam. Wenn du eine Funktion mit memcpy hast, weshalb postest du sie dann nicht? Willst du, dass wir raten?

    Ausserdem solltest du jetzt endlich [cpp]-Tags verwenden.

    Sisko86 schrieb:

    Das mit den Schleifen könnt ihr vergessen an denen liegts nicht wieso auch sind ja nur überprüfungen.

    Können wir vergessen. Wenn ein ungültiger Zeiger dereferenziert wird, ist ja nichts passiert... 🙄



  • Kann nicht die riesige Funktion hier reinkopieren.
    Hab aber den Fehler glaube ich schon gefunden. Kann es sein dass das new nicht mehr Funktioniert, wenn man mit memcpy auf eine Speicherstelle kopiert, die eigentlich schon wieder freigegeben wurde.
    Komischer weiße ist memcpy nicht abgestürzt.



  • Genau sowas nennt man "undefiniert"...



  • für riesige Funktionen http://rafb.net/paste



  • Sisko86 schrieb:

    Komischer weiße ist memcpy nicht abgestürzt.

    Ja, komischerweise kannst du dich bei undefiniertem Verhalten nicht darauf verlassen, dass etwas Bestimmtes passiert. Deswegen heißt das so.



  • Wieso verwendest du memcpy überhaupt? In C++ sollte es eigentlich genügend Alternativen geben. Ich zum Beispiel bin bis jetzt sehr gut ohne diese C-Funktion ausgekommen. Dann passieren auch solche undefinierten Verhalten nicht, wenn man es mit new vermischt.

    Sisko86 schrieb:

    Kann nicht die riesige Funktion hier reinkopieren.

    Es hätte gereicht, den relevanten Teil (z.B. die Zeile mit memcpy ) zu posten.

    Noch was: Es wurde zwar schon gesagt, aber du solltest jedes Mal, wenn du mit new dynamischen Speicher anforderst, auch ein entsprechendes delete haben, das den Speicher wieder freigibt.



  • Delete hab ich jetzt mal weggelassen weil ich das Objekt ja nur zum debuggen erzeugt habe.

    Nächstes mal formuliere ich meine Fragen mit Code etwas genauer.
    Danke für eure Hilfe


Anmelden zum Antworten