vector.push_back() verursacht fehler
-
Hallo,
meinem Programm stürzt an einer bestimmten Stelle ab, wenn dort die Zeile meinVector.push_back(status()) abgearbeitet wird.
Es folgt der Fehler:
"Windows hat einen Haltepunkt ausgelöst. Dies kann auf eine Beschädigung des Heaps zurückzuführen sein..."
Vor dem Absturz werden folgende Funktionen aufgerufen:void push_back(const _Ty& _Val) // insert element at end
void _Reserve(size_type _Count) // ensure room for _Count new elements, grow exponentially
void reserve(size_type _Count) // determine new minimum length of allocated storage
void deallocate(pointer _Ptr, size_type) // deallocate object at _Ptr, ignore size
void operator delete( void * p )
void __cdecl _free_base (void * pBlock)
retval = HeapFree(_crtheap, 0, pBlock); //hier kommt der fehlerMein Vectortyp "status" sieht so aus:
struct einheitenStatus{ markierung clip[truppenStärke]; }; struct markierung{ punkt pos; char typ; }; struct punkt{ unsigned int x; unsigned int y; };Was könnte ich falsch gemacht haben, damit es zu sowas kommt? Schonmal danke!
-
Gib mal ein minimales compilierbares Beispiel an dem sich der Fehler nachvollziehen lässt.
Sofern der vector auch exisitert (und du z.B. nicht über einen kaputten Pointer zugreifst), kann ich mir nur vorstellen, dass du vorher irgendwo undefiniertes Verhalten ausgelöst hast. push_back sollte nämlich eigentlich nichts auslösen können. Die Fehlermeldung mit der Beschädigung des Heaps deutet auch stark da drauf hin, das eines der beiden der Fall ist.
-
Hi, ich hab den Fehler gefunden. Mein Vector speichert Arrays und ich habe beim ersten Vectorelement auf ein Arrayelement zugegriffen, dass nicht existiet. Seltsamerweise kam der Fehler nicht sofort an dieser Stellen, sondern erst beim nächsten Aufruf von push_back(). Trotzdem danke SeppJ!
-
Knobbers schrieb:
auf ein Arrayelement zugegriffen, dass nicht existiet.
Das erzeugt undefiniertes Verhalten.
Seltsamerweise ...
Seltsam ist der zweite Vorname von UB. Undefiniert heißt, dass quasi alles passieren kann. z.B. ein einfacher Absturz, rosa Elefanten auf dem Schirm, oder eben das, was möglicherweise hier passiert ist:
- der Arrayzugriff hat Daten in den Heap geschrieben, an eine Stelle, die dir nicht gehört. Vielleicht z.B. in den Infoblock eines Stücks Heap, in dem vorher stand, wie groß das entsprechende Stück Heap ist. Heapfree benutzt diese Informationen, um zu wissen, wieviel Speicher da freigegeben wurde. Wenn die Infos nicht stimmen ...*bumm*