Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.06.2006, 18:55

Problem mit list::erase

Hallo,

Ich bin noch neu im Forum und habe jetzt erstmalig ein Problem bei dem ich keine Ahnung habe wie es zu lösen ist. Ich habe folgende Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void CFleet_manage::Fleet_Kill(const int id)
{
    int Anzahl;
    for (i=m_lfleets.begin();i!=m_lfleets.end();i++) {
        
        cout<<"\n Die ID des Objektes an Position "<<(*i)<<" betr\x84gt: "<<(*i)->m_ID;
        cin>>Anzahl;
        if ((*i)->m_ID==id){//Es wird die ID des in der Liste gespeicherten Objekts mit der übergebenen ID veglichen.

        cout<<"\nID des \x83 \bberpr\x83 \bften Elements entspricht der uebergebenen ID.";
        m_lfleets.erase(i);
        }
    }
}//Fleet_Kill


Der Compiler gibt keinen Fehler aus, doch wenn die Funktion aufgerufen wird gibt es folgende Fehlermeldung:

Unbehandelte Ausnahme bei 0x0043c101 in Celestial Armies 3.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xfeeefef6.

In der Liste m_lfleets befinden sich Objekte einer Klasse (CFleet).

Weiß jemand was ich dagegen machen kann?

Anonymous

unregistriert

2

15.06.2006, 19:04

Ist klar, Du ballerst ja regelrecht über end() hinaus! Daher analysiere mal diesen Code (der das Benutzen vo erase zeigt):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            // Alle bitmaps durchgehen

        for (bitmap_it_=bitmap_.begin(); bitmap_it_!=bitmap_.end(); /*++bitmap_it_*/)
        {
                // Nur Grafiken löschen die nicht fixiert sind.

            if (!(*bitmap_it_)->fixed_)
            {
                    // Item intern freigeben

                bitmap_item *item = (*bitmap_it_);
                delete item;

                    // Objekt aus Liste löschen

                bitmap_it_ = bitmap_.erase (bitmap_it_);
            }
            else
            {
                    // Inkrementieren

                ++bitmap_it_;
            }
        }

3

15.06.2006, 19:22

OK, danke. Jetzt gehts.

Sehe ich das richtig:
Wenn ich erase verwende, ohne das Ergebnis im Iterator zu speichern, zeigt der Iterator auf einen leeren Platz in der Liste und verursacht so den Fehler??

Anonymous

unregistriert

4

15.06.2006, 19:45

ja, weil du dann bereits auf end() stehst und mit it++ über end() hinausschießt!

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

5

15.06.2006, 23:46

Das muss gar nicht mal end() sein, wo man nach dem erase() steht. Ein Iterator, den man aus einer Liste löscht, ist hinterher einfach ungültig, so dass der Operator ++ bereits ein falsches Ergebnis liefert. Erase liefert einfach den nächsten gültigen Iterator in der Liste nach dem gelöschten Element; oder eben end(), wenn es das letzte war.

Das gilt generell für jedes erase() in einem stl Container (map, vector, set, ...)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige