[gelöst] Elemente aus vector<class*> löschen



  • Hi,

    beim folgenden Problem hab ich wohl nur einfach ein Brett vorm Kopp.

    Ich habe einen vector aus zeigern auf mehrere Instanzen einer anderen Klasse (class listElement), also vector<ListElement*> myListElements.
    Diesen vector möchte ich nun leeren und alle darin enthaltenen Elemente löschen.

    Mein Code

    ListElement* TempListElement;
    
    while(myListElements.empty() == false){
            TempListElement = myListElements.front();
            myListElements.erase(myListElements.begin());
            delete TempListElement;    //Fehler
                                       //(Auch bei &TempListElement)
        }
    

    wirft immer einen Segmentation fault oder ähnlichs.
    Da ich im debug modus über TempListElement immernoch auf das ListElement zugreifen kann, wird das bei erase offenbar nicht gelöscht, oder irre ich mich da?
    Dass das ListElement auch Zeiger auf andere Klasseninstanzen besitzt müsste doch eigentlich egal sein, oder?

    Ich hoffe ihr könnt mein Brett entfernen. Wer es kann, darf es behalten, ist schöne dicke Eiche 😃

    Viele Grüße
    Cherup



  • 1. das stück ist korrekt
    2. solltest du bei einem vector "von hinten" löschen, weil du sonst alle elemente ständig umkopierst



  • zu 2.:
    Habs grad ausprobiert, da bekomm ich bei

    myListElements.erase(myListElements.end())
    

    einen segmentation fault 😃
    Irgendwie läuft da was gewaltig verkehrt in meinem System 🙄



  • .end() zeigt hinter das Ende der Sequenz, d.h. .end() zeigt nicht auf ein Element, d.h. du kannst auch kein Element an Position .end() löschen. Stichwort halboffenes Intervall, also [begin, end) .
    Was du löschen kannst ist .end() - 1 . Vorausgesetzt .end() != .begin() natürlich.



  • Ich hab meinen Fehler gefunden.

    Das Problem war, dass die zu löschende Klasse ein Qt-Widget ist und ich in einem dekontruktor eines anderen Widgets was vergessen hatte bzw nicht wußte.

    Nunja, Qt Widgets unterscheiden sich in manchen dingen eben doch von den "normalen" c++-Klassen.



  • while(myListElements.empty() == false){

    Ich mag diesen Stil nicht. Machen viel so, aber ich mags nicht und ich wollts mal ansprechen. empty oder !empty find ich viel klarer und verständlicher, als einen Vergleich mit irgendeinem Wert "false", der nur am Rande mit dem ganzen zu tun hat.


Log in to reply