Itterieren über eine Collection



  • Hallo ,

    ich habe eine Collection

    using namespace std; 
         list<CString*>     m_pobDateien;
    

    Diese Collection fülle so aus:

    CString  sDateiname;
        sDateiname = m_pobDateien.push_back( &sDateiname );
    

    Wenn ich über diese Collection itteriere

    CString sDateiname; 
       CString*  poDateiname = 0;
       list<CString*>::iterator   oIter;
       for( oIter = pobDateien.begin(); oIter != pobDateien.end(); ++oIter ) {
            poDateiname = ( *oIter );
            if( poDateiname ){
    	 sDateiname = *poDateiname;  
    	} 
       }
    

    dann stürze ich an der Zeile : sDateiname = *poDateiname; ab.

    Was kann der Grund sein ?

    Danke.

    Viele Grüße ,
    Elke



  • Vielleicht solltest du statt Zeigern lieber die Objekte selber in deiner list speichern. Und wenn du doch Zeiger brauchst, erzeuge sie per new auf dem Heap.

    (die Variable sDateiname, deren Adresse du eingetragen hast, ist beim Auslesen schon lange nicht mehr gültig - also zeigen die list-Elemente auf irgendwelchen Datenmüll im Stack)



  • Ich ergänze mal In-Place:

    Elke100 schrieb:

    {
        CString  sDateiname; // lokale Variable
        sDateiname = m_pobDateien.push_back( &sDateiname ); // Adresse einer lokalen Variable 
    } // lokale Variable stirbt -> in der Collection steht ein ungültiger Zeiger
    

    Das ist der Grund 😉

    Aber musst Du wirklich Zeiger in den vector packen? CString (wenn von MFC) ist doch sogar Referenzgezählt.



  • Hallo CStoll,

    stimmt ! Ich gehe ja aus der Methode raus ...

    Mensch , habe doch schon ein paar Mal so einen Fehler gehabt 😞

    Danke!

    Viele Grüße ,
    Elke


Anmelden zum Antworten