Wie speicher freigeben bei Array von Listen



  • Hi,

    ich erzeuge folgendermaßen ein Array von Listen:

    unsigned int prime2 = 7; 
    std::list<const int*>* spatialList;
    spatialList = new list<const int*> [prime2];
    

    Später versuche ich es so freizugeben:

    delete[] spatialList;
    

    Irgendwie scheint es so nicht zu gehen. Es wird nicht der ganze Speicher freigegeben.
    Was muß ich anders machen?



  • Was ist denn der "ganze Speicher"? Außerdem nimmt man da std::vector .


  • Mod

    Das sollte eigentlich funktionieren. Beachte aber, dass der Destruktor von list nur den Destruktor auf die Elemente aufruft, das heißt, deine const int* werden abgeräumt. Aber das heißt nicht, dass die Objekte abgeräumt werden auf die die const int* zeigen. Falls du dies willst, musst du das entweder vor dem löschen der Liste manuell machen oder besser noch eine Wrapperklasse mit RAII als Listenelement benutzen.

    Aber warum benutzt du eigentlich keinen vector statt des Arrays? Da träte zwar das gleiche Problem auf, aber du brauchst dich wenigstens nicht um das new/delete kümmern und bist zudem noch flexibler.



  • Wie mache ich das denn mit einem Vector ohne new delete?
    Ich habe schon einige Zeit (und viele Versuche) gebraucht um diese Version hinzubekommen.

    Sorry edited....


  • Mod

    Andreas XXL schrieb:

    TyRoXx schrieb:

    Was ist denn der "ganze Speicher"? Außerdem nimmt man da std::vector .

    Ich brauche wirklich die Liste und nicht Vector.

    Wir beziehen uns auf die Verwendung des dynamischen Arrays. Du sollst einen vector von Listen benutzen.

    Es wird halt nicht der ganze angeforderte Speicher wieder freigegeben.
    (Das kann ich im Taskmanager sehen wenn ich das Erzeugen und Löschen der Liste in eine Schleife packe und es zum Test oft wiederholen lasse)

    Die Speicherbenutzung im Taskmanager hat in etwa so viel mit dem benutzten Speicher deines Programms zu tun wie eine historische Hochwassermarke mit dem aktuellen Wasserstand eines Flusses.

    Nach sehr vielen Widerholungen stürzt es sogar ab.

    Dann ist was falsch in deinem Programm, möglicherweise ein anderes Speicherloch. Wie ich schon sagt wird zum Beispiel alles auf das deine Listenelemente zeigen nicht abgeräumt, das klingt für mich nach einem sehr wahrscheinlichen Kandidaten für das Speicherloch.


  • Mod

    Andreas XXL schrieb:

    Wie mache ich das denn mit einem Vector ohne new delete?

    std::vector<std::list<const int*> > spatialList(prime2);
    

    Das beseitigt natürlich nicht das andere von mir angesprochene (potentielle) Problem. Denn deine new/delete-Aktion war an sich schon richtig, der vector ist bloß sicherer und einfacher zu benutzen.



  • std::vector<std::list<const int*> > spatialList(prime2);

    So sind die Speicher Probleme verschwunden...
    (Bei meinen Programm ist prime nicht 7 sondern einige millionen, vieleicht liegts daran)

    Nur jetzt dauert das Erzeugen des Vectors ewig... (30 Sekunden und mehr)


  • Mod

    Andreas XXL schrieb:

    std::vector<std::list<const int*> > spatialList(prime2);

    So sind die Speicher Probleme verschwunden...
    (Bei meinen Programm ist prime nicht 7 sondern einige millionen, vieleicht liegts daran)

    Nur jetzt dauert das Erzeugen des Vectors ewig... (30 Sekunden und mehr)

    Benutz mal eine optimierte Version. Eigentlich sollte das nämlich genau gleich schnell gehen wie new.

    Aber mehrere Millionen Listen? Irgendwie klingt das danach, als hättest du ein ernsthaftes Designproblem.


Log in to reply