std::vector erase Nachfrage
-
Hi!
Ich glaube, dass ich auf genau dieses Problem gestoßen bin:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-211725-and-highlight-is-vector+erase.htmlVerstehe ich das richtig? Das erase sorgt tatsächlich für defekte (per Pointer) referenzierte Elemente, wenn man bsw. das erste Element löschen will?
Dann ist der Vector also nur für native oder 'flache' Sammlungen zu gebrauchen?Wodurch würdet Ihr in dem Fall den std::vector ersetzen?
...oder habe ich etwas falsch verstanden?
-
SammyRukka schrieb:
Verstehe ich das richtig? Das erase sorgt tatsächlich für defekte (per Pointer) referenzierte Elemente, wenn man bsw. das erste Element löschen will?
Dann ist der Vector also nur für native oder 'flache' Sammlungen zu gebrauchen?Nein. class Enemy wie gezeigt ist schlicht nicht Containerkompatibel. Der Zuweisungsoperator erzeugt flache Kopien (was zu doppeltem delete führt) und der Copyctor erstellt nicht immer äquivalente Kopien.
-
Hmmm, dann komme ich aber immer noch nicht mir.
Meine Mit-Pointer-Klasse hat einen Copy-Konstruktor und legt darin auch eine neue 'verpointerte' Instanz der Pointer-Inhalt-Klasse an. Die hat ebenfalls einen Copy-Konstruktor (den ich ja auch benutze).
Warum dann bei mir das doppelte delete? Zumal das 2. delete ja auch auf den Pointer des zweiten Elements des Vectors geht und nicht noch einmal auf den gelöschten Bereich.
Und hast Du das nicht in Deinem letzen Beitrag (siehe Link) auch so beschrieben?Sry, falls ich das Missverstehe.
-
zeig den code her. irgendwo erzeugst du flache kopien.
ich tippe auf den operator=aber ohne code, kann man nur raten.
-
Ach ich Idiot! Wußte nicht, dass Magen-Darm auch auf den Kopf schlägt....
Der Zuweisungsoperator ist '='
Den habe ich natürlich nicht definiert.
Also braucht die 'Mit-Pointer-Klasse' eine eigene Implementierung von =, damit das umsortieren, das erase macht, funktioniert?
Ich steige dann aber nicht dahinter, wann erase den =-Aufruf macht (wenn dem so ist), der Satz von queer_boydu müsstest es aus dem array herausnehmen, und letztendlich alle anderen elemente, die nach dem element, auf das der iterator zeigt, kommen, eines nach hinten kopieren.
kommt mir da komisch vor. Muss erase die Elemente nicht nach vorn kopieren (an die Stelle des gelöschten) oder war das gemeint?
An den Code komme ich im Moment nicht dran, kann also auch nicht probieren.
-
erase ruft den operator= auf beim loeschen eines objektes. dann muessen alle objekte die nach diesem geloeschten objekt platziert waren ja eins nach vorne wandern... und da wird dann eine flache kopie erstellt und das fuehrt zu dem zweimaligen delete.
was ctor, copyctor und op= betrifft: die fallen unter The Law Of The Big Three.
-
Jajaja, wäre in Java gar nicht notwendig gewesen, da funzt der Vector auch so...

OK. Hab's verstanden und 'the big three' war mir eigentlich auch klar.
Werde das morgen mal korrigieren.Danke Euch!!
-
SammyRukka schrieb:
Jajaja, wäre in Java gar nicht notwendig gewesen, da funzt der Vector auch so...

kein problem in c++. mach einen vector<shared_ptr<Enemey> > und du hast die selbe semantik...