iterator- oder speicher-problem



  • folgender Code:

    iter = m_PossibleOutputs[n].descriptors.begin();
          iterend = m_PossibleOutputs[n].descriptors.end();
    
          while( iter != iterend )
          {
            if( deleteIterator )
            {
              iter = m_PossibleOutputs[n].descriptors.erase( iter );
              deleteIterator = false;
            }
            else
            {
              iter ++;
              originb4 = origincur;
            }
    
            ...
    
            if( Equal( originb4, origincur ) )
            {
              ...
              timeOutput = new DifferentOutputs;
              timeOutput->refferenceUID = m_PossibleOutputs[n].refferenceUID;
              timeOutput->normale = m_PossibleOutputs[n].normale;
              timeOutput->pixelSpacing = m_PossibleOutputs[n].pixelSpacing;
              timeOutput->sliceSpacing = m_PossibleOutputs[n].sliceSpacing;
              timeOutput->numberOfSlices = - 1;
              timeOutput->numberOfTimeSlices = - 1;
              timeOutput->differentTimeSlices = false;
              timeOutput->descriptors.clear();
              timeOutput->descriptors.push_back( (*iter) );
            }
            else
            {
              ...
              m_PossibleOutputs.push_back( (*timeOutput) );
              delete timeOutput;
              timeOutput = NULL;
            }
            ...
           }
    

    Erweiterung:
    -iter und iterend sind Iteratoren;
    -bei DifferentOutputs handelt es sich um eine Struktur;
    -timeOutput ist ein Zeiger auf DifferentOutputs;
    -bei m_PossibleOutputs um einen Vector von DifferentOutputs;
    -bei m_PossibleOutputs.descriptors handelt es sich um eine Liste;
    -in den ... befindet sich kein quelltext, der mit iter, iterend oder timeOutput zu tun hat

    Problem:
    wenn ich zum zweiten mal timeOutput neu erstelle und anschließend per "m_PossibleOutputs.push_back( (*timeOutput) );" speichere, ist mein iter hin.
    ich habe nummern für die elemente, über die der iterator läuft. wenn ich mir vor der zeile "m_PossibleOutputs.push_back( (*timeOutput) );" die restlichen elemente zwischen iter und iterend ausgeben lasse, dann sehen die zum beispiel so aus:

    266
    267
    268
    269
    270
    271

    lasse ich mir die restlichen elemente nach dem aufruf ausgeben, dann sieht das so aus:

    266
    265
    264
    263
    262
    261

    Das läuft dann bis zum anfang zurück und weil davor nichts mehr kommt, booom.

    //Edit: Codetags hinzugefügt. In Zukunft bitte selber dran denken! (evilissimo)



  • Was für einen Container verwendest du? Bei einem vector<> kann es passieren, daß der push_back()-Aufruf die Kapazität erhöhen muß - dabei werden alle noch vorhandenen Iteratoren ungültig.

    PS: sfds



  • ich verwende den std::vector.
    es wird wahrscheinlich daran liegen. was kann man dagegen unternehmen?



  • Wenn du weißt wie groß der Vektor wird gibt's vector<>::reserve , ansonsten Indices statt Iteratoren speichern.



  • Entweder die notwendigen Iteratoren nach dem push_back() neu beschaffen oder umsteigen auf einen anderen Container (list<> zerstört keine Iteratoren, wenn es nicht sein muß).



  • hopsekey schrieb:

    ich verwende den std::vector.
    es wird wahrscheinlich daran liegen. was kann man dagegen unternehmen?

    Gleich auf die richtige Größe setzen, oder Iterator neu holen.



  • 😡 dieser doofe fehler hat mich unzählige nerven und 1 1/2 tage gekostet.

    ALSO EIN RIESEN DANKESCHÖN für den Tipp.

    Ich habe es jetzt so gelöst.

    ...
    tempDescriptor = (*iter);
    m_PossibleOutputs.push_back( (*timeOutput) );
    iter = m_PossibleOutputs[n].descriptors.begin();
    iterend = m_PossibleOutputs[n].descriptors.end();
    while( (*iter) != tempDescriptor ) iter++;
    ...
    

    Und es funktioniert. Jetzt kann man noch über eine schönere Variante reden. 😉

    list<> zerstört keine Iteratoren, wenn es nicht sein muß

    aber sie macht es trotzdem irgendwann, irgendwie mal? den fall müsste ich abfangen.

    weißt wie groß der Vektor wird

    leider nicht.



  • hopsekey schrieb:

    list<> zerstört keine Iteratoren, wenn es nicht sein muß

    aber sie macht es trotzdem irgendwann, irgendwie mal? den fall müsste ich abfangen.

    Ja, wenn du das betreffende Element löschst.


Anmelden zum Antworten