delete will nicht



  • Hallo
    Ich hab Probleme mit delete.
    Folgender code soll Einblich verschafen:

    if (keys[VK_DELETE])
    				{
    				if(objectList->first!=NULL)
                                    {
                                    GLObject *temp = objectList->first;
                                    objectList->first=objectList->first->next;
                                    delete temp;
                                    }
    				}
    

    Wenn ich das Object ( erstes in der Liste ) mit delete löschen will um den Speicher freizugeben passiert nix.

    Im TaskManager wird der Speicher weiterhin belegt.



  • Hallo

    Ich habe keine Ahnung, aber musst du Speicher nicht erst mit new abnfordern, bevor du Ihn mit delete freigibst?

    chrische



  • der Speicher wurde bei der Objekterstellung mit new Angefordert
    und zwar so:

    if (keys[VK_INSERT])
    		{
    		objectList->add(new GLObject((float)random(50)/10-2.5,
                                                 (float)random(50)/10-2.5,-6.0f));
                    if(!objectList->last->LoadGLTextures())
                    return 0;
    		}
    


  • deleteme schrieb:

    Wenn ich das Object ( erstes in der Liste ) mit delete löschen will um den Speicher freizugeben passiert nix.

    Und das folgerst du allein aus der Anzeige des Taskmanagers? Oder gibt es noch andere Hinweise?

    Der Taskmanager ist für die Diagnose von Speicherproblemen denkbar ungeeignet. Es ist jedenfalls nicht möglich, über die angezeigten Werte jedes new und delete nachzuvollziehen.

    Setz doch mal eine Debugausgabe in den Destruktor von GLObject.



  • ich kenn mich mit debuggen kaum aus.

    was sollte ich denn in den destruktor legen?

    mit "Taskmanager" mein ich die Speichernutzung.
    Bei erstellen von Objekten steigt der Speicher.
    Beim löschen bleibt er unverändert.



  • ich hab jetzt am destruktor ein breakpoint gesetzt.
    scheinbar wird er nie erreicht.



  • deleteme schrieb:

    ich kenn mich mit debuggen kaum aus.

    Das solltest du ändern 😉

    was sollte ich denn in den destruktor legen?

    Irgendwas, woran du erkennen kannst, dass er aufgerufen wure. cout, printf, MessageBox, was auch immer. Am besten wäre natürlich ein Breakpoint.

    mit "Taskmanager" mein ich die Speichernutzung.
    Bei erstellen von Objekten steigt der Speicher.
    Beim löschen bleibt er unverändert.

    Kann schon sein. Wie gesagt, der Taskmanager ist dafür das falsche Werkzeug. Aus den Werten solltest du nicht schließen, dass delete nicht funktioniert.

    deleteme schrieb:

    ich hab jetzt am destruktor ein breakpoint gesetzt.
    scheinbar wird er nie erreicht.

    Hast du das Programm denn im Debugger gestartet?



  • ähm mom mal ausprobieren ^^



  • also es sieht jetzt so aus.

    Hab ne MessageBox hinzugefügt und der Destruktor wird aufgerufen.

    ich versuch jetzt mal folgendes.

    ich mach den speicher nach und nach voll.
    ich füge objekte hinzu und losche sie wieder, mal sehen was passiert wenn ich die grenze im Task Manager erreiche.



  • und wie ichs befürchtet habe:
    Dem System steht nicht genügend Arbeitsspeicher zur verfügung.

    Irgendwas geht hier schief^^



  • Hi!

    Möglich, allerdings ist es für diejenigen (alle außer dir) recht schwer festzustellen was genau schief geht, da wir deinen Quellcode nicht kennen. *Wink mit dem Zaunpfahl*

    grüße



  • ich glaub ich had das problem jetzt gelöst .
    In meinem Objekt das ich lösche habe ich Texturen(opengl).
    Jetzt hab ich in nem Tutorial gelesen dass man die mit :

    glDeleteTextures( 1, &texture );

    deleten soll.

    wenn ich zu Hause bin probier ichs mal aus.
    Ich bin mir ziemlich sicher dass es daran liegt.



  • Hi!

    Dadurch wird allerdings nur die OpenGL intern verwendete Resource freigegeben. Der reservierter Speicher, für DEIN Objekt, ist damit noch lange nicht freigegeben. Da hilft dir nur ein delete.

    grüße



  • ich könnt ja mal teile des codes posten , doch der ist ziemlich lang.

    ich werd es erstmal zuhause noch alleine probieren , wenn ichs heut nicht schaffe, dann poste ich teile des codes.



  • Dann gehört ein "glDeleteTextures( 1, &texture );" in den Destruktor. Dann reicht ein delete.

    Selbst dann kann es aber gut sein, daß Du in der Prozeßliste nichts siehst. Die Speicherverwaltung von C++ fordert Speicher vom Betriebssystem in grösseren Blöcken an. Der Speicher steht dann der Speicherverwaltung für mehrere new-Aufrufe zur Verfügung. Gibtst Du den Speicher mit delete frei, kann es sein, daß die Speicherverwaltung in deinem Prozeß den Speicher zwar als frei markiert, aber das nicht dem Betriebssystem mitteilt. Der Speicher steht dann für das nächste new zur Verfügung, ist aber auch Betriebssystemsicht noch immer belegt.

    Tommi



  • ich glaubs kaum .
    ich hab
    glDeleteTextures( texturanzahl, &texture[0] );

    in den Destruktor gelegt und siehe da dar Speicher leckt nicht mehr.
    Auf den ersten Blick jedenfalls.
    Ich schau mal ob ich nicht irgendwo noch Speicher verliere.

    Danke schonmal allen für die Tipps.


Anmelden zum Antworten