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
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
virtual bool Delete( size_t array_num, bool delete_data = 1 ) { // if in vector if( array_num < objects.size() ) { objects.erase( objects.begin() + array_num ); } if( delete_data ) { delete objects[array_num]; } return 1; } |
simbad
unregistriert
[...] Greift man über den Array-Operator überhaupt noch auf dieses Element zu? Wieso ist das dann noch im Vektor? Oder manipuliert man per erase() nur Iterator-Zugriffe?
Findet nach dem erase() nicht ne Reallokation statt, wenn man ein Element mittenraus löscht? [...]
Kennst du da konkrete Implementierungen? Soweit ich weiss sagt der Standard, das nie geschrumpft wird.[ Andere Implementierungen schrumpfen ab und zu, nämlich immer wenn ein gewisser Grenzwert an unbenutztem Speicherplatz überschritten wird.
Wird nicht einfach das nächste Element hinter array_num deleted, sofern es das gibt? Denn im Prinzip greift man ja noch mal auf array_num zu und wenn man das vorher schon gelöscht hat und der ganze Container eins nach vorn rückt...Nach dem erase() ist das Element nicht mehr im Vektor, das was da deletet wird, ist irgendetwas unsinniges oder existiert nicht und führt direkt zum Crash.
Wie wäre denn dann die Lösung für das Problem? Reicht es, den vector<*T> zu einem vector<unique_ptr<T>> zu machen?
Kennst du da konkrete Implementierungen? Soweit ich weiss sagt der Standard, das nie geschrumpft wird.[ Andere Implementierungen schrumpfen ab und zu, nämlich immer wenn ein gewisser Grenzwert an unbenutztem Speicherplatz überschritten wird.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CodingCat« (08.04.2013, 21:26)
Das Problem ist, diese Delete-Operation sinnvoll auszuführenMöglicherweise, aber wenn du nach einer Lösung für ein Problem suchst, würd's nicht schaden, erstmal zu erklären, was genau eigentlich das Problem ist...
Quellcode |
|
1 2 3 4 5 6 7 8 |
void Delete( size_t array_num, bool delete_data = true ) { // zuerst das Element löschen if( delete_data ) delete objects[array_num]; // dann den (jetzt ungültigen) Zeiger entfernen objects.erase( objects.begin() + array_num); } |
Werbeanzeige