list in stl löschen



  • hallo,
    ich habe mal eine grundlegende frage zum Löschen von elementen in einer list aus der stl.

    Ich habe als beispiel eine liste aus zeigern angelegt.

    Wenn ich nun die liste mit der funktion clear() lösche, werden dann auch alle elemente gelöscht, auch wenn ich nur einen Zeiger auf diese elemente zeigen habe?

    in diesem beispiel ist eben nur gezeigt wie es mit der anbindung eines normales objektes geht.

    hier die clear funktion:

    http://www.cplusplus.com/reference/stl/list/clear/

    gruß anno



  • anno schrieb:

    hallo,
    ich habe mal eine grundlegende frage zum Löschen von elementen in einer list aus der stl.

    Ich habe als beispiel eine liste aus zeigern angelegt.

    Wenn ich nun die liste mit der funktion clear() lösche, werden dann auch alle elemente gelöscht, auch wenn ich nur einen Zeiger auf diese elemente zeigen habe?

    Nein - es waere auch unsinnig. Die Zeiger sind ein Reference wo ein Object steht. Du koennest mehrere solcher Listen haben, die z. B. Teilmengen oder sortierte Mengen besitzen. Diese muessen zerstoert oder neu aufgebaut werden koennen, ohne die urspruenglichen Daten zu veraendern - z.B. zum Zwischenspeichern eines Suchergebnisses.



  • also müsste ich dann trotzdem alle elemente der liste durhcluafen und mit "delete" jedes elemente einzeln löschen.



  • anno schrieb:

    also müsste ich dann trotzdem alle elemente der liste durhcluafen und mit "delete" jedes elemente einzeln löschen.

    Ja.
    Oder Smart-Pointer verwenden.
    Oder boost::ptr_list verwenden.



  • anno schrieb:

    also müsste ich dann trotzdem alle elemente der liste durhcluafen und mit "delete" jedes elemente einzeln löschen.

    Wenn Du alle Elemente der Liste mit dem new-operator aufgebaut hast schon, aber Du kannst mehr als zwei Listen haben:

    list <MyClass  > MyData;
    list <MyClass *> MyReferences_0;
    list <MyClass *> MyReferences_1;
    list <MyClass *> MyReferences_2;
    

    MyReferences enthaelt nur die Pointer auf Elemente von MyData. Wenn Du MyData loechst, loechst Du alle Objecte vom Type MyClass in der Liste, wenn Du MyReferences_n loechst, loechst nur die Reference darauf ohne die Daten selber anzupacken.



  • ja ok das ist klar, in meinem fall habe ich dann nur eine liste.

    danke



  • anno schrieb:

    ja ok das ist klar, in meinem fall habe ich dann nur eine liste.

    danke

    Das Problem waere z. B. folgendes (Liste von 4 Elementen):

    list <MyClass *> MyDataList;
    
    for (int iLoop = 0; iLoop < 4; iLoop++)
        MyDataList.push_back (NULL);
    
    // Jetzt hast Du eine Liste voller NULL-Pointer
    // die jetzt aufgefuellt wird
    
    for (list<MyClass *>::iterator iLoop; iLoop != mylist.end(); iLoop++)
        MyDataList [iLoop] = new MyDataList;
    
    // Wenn Du jetzt einfach das machst:
    
    delete MyDataList; //ERROR
    
    // Beleiben die mit dem new-Operator geschaffen Objecte irgentwo im Heap stehen
    // ohne das Du weisst wo sie stehen
    

    Du kannst das auch sinnvoll ausnutzen:

    list <MyClass>   MyDataList;
    list <MyClass *> TempSearchResults;
    
    FillListData (MyDataList);
    
    // Jetzt stehen Daten in der Liste
    
    SearchListFor_ABC (MyDataList, TempSearchResults);
    ShowSearchList (TempSearchResults);
    
    TempSearchResults.empty ();
    
    SearchListFor_CDE (MyDataList, TempSearchResults);
    ShowSearchList (TempSearchResults);
    
    // etc.
    

    Du kannst also eine Referenzliste haben, diese beliebig manipulieren oder zerstoeren ohne die Daten selber anzupacken.



  • Oder wie eingangs schon erwähnt boost::ptr_list die übernimmt das aufräumen für dich wenn mit new erzeugt Elemente einhängst.



  • Oder einfach keine Zeiger, sondern direkt Klasseninstanzen in der Liste speichern. Meistens reicht das auch, wenn man nicht gerade Polymorphie benötigt oder gewisse Abhängigkeiten in Headern vermeiden will.


Anmelden zum Antworten