Problem mit CTypedPtrList
-
Hallo zusammen,
ich habe ein Problem mit einer Liste vom Typ CTypedPtrList, die Pointer auf Objekt speichert. Sie ist ein Member einer Klasse, deren Instanzen immer auf dem Heap erstellt werden. In den meisten Fällen funktioniert es korrekt, nur stoße ich nach einigen Berechnungsschritten immer wieder an der gleichen Stelle auf folgendes Problem:
An einer Stelle, an der die Liste eigentlich leer sein müsste, ist der Count der Elemente im dreistelligen Millionenbereich und der Tail Pointer gibt eine falsche Adresse an (kein NULL Pointer mehr).
Ich bin alle Einzelschritte im Debugmodus durchgegangen: Von der Erstellung der Instanz der Klasse bis zu dem Punkt, an dem der Fehler ausgegeben wird und habe dabei die Wert der Liste überwacht. Die Liste wird von meinem Code nicht verändert. Die Werte ändern sich ins Unsinnige an einem Punkt im Quellcode, an dem nichts anderes gemacht wird als Pointer auszulesen und einige Rechenoperationen (+-*/) durchgeführt werden.
Es werden nur Daten an Adressen verändert, die schon existieren. Die new und delete Operatoren sind nicht im Spiel.
Und wie gesagt, die Liste selber wird nicht berührt.Was könnte so einen Fehler hervorrufen? Ich bin ratlos...
edit:
Habe hier im Forum gelesen, dass eventuell der Speicher zerstört werden kann. Jetzt meine Fragen:
Wie läuft das ab?
Wann passiert das und
wie vermeide ich das?
Hat der Heap nur eine bestimmte Größe?
Und wenn ja wie ändere ich die?
Kann mein Heap voll sein?Vielen Dank im Voraus.
kyp
-
du musst wohl bischen code zeigen wo das problem auftritt, so ist das schwer nachzuvollziehen
-
Das Problem ist welchen Abschnitt im Code?
double Point::SET_POINT_PRIORITY(double distance, double velocity, Point* prev_point) { if(!prev_point) { point_priority = distance/velocity; } else { point_priority = prev_point->GET_POINT_PRIORITY() //gibt double zurück + distance/velocity; //<- wenn das ausgeführt wird //ändern sich die Werte eines völlig anderen //Objekts! Daher kann ich nicht viel Code zeigen :( } return point_priority; }Aber es kommt auch ganz auf die Eingaben an, habe ich festgestellt. Manchmal bricht er bei A ab und dann wieder bei B. Dabei sind es bei gleichen Eingaben immer die gleichen Stellen.
Manchmal kommt die Meldung:
"Windows hat einen Haltepunkt ausgelöse..." "Es könnte auf eine beschädigung des Heaps zurückzuführen sein"und diese Funktion (hab ich eben im Forum gefunden) spricht auch an:
ASSERT(AfxCheckMemory());Ich habe meinen ersten Beitrag editiert und glaube es liegt am Heap. Nur kenne ich mich da so gar nicht aus. Kannst du die Fragen beantworten?
Vielen Dank schonmal
KypPS:
Klassendeklaration in der die Liste liegt:class Flow_Field : public CObject { public: Flow_Field(void); public: ~Flow_Field(void); void SET_FF_COORDINATES(void); //calculates the points' xpositions in this ff void SET_FF_POINT_PRIORITIES(double kappa); //calculates the points' priority void SORT_POINTS_LIST(void); //sorts the points according to the points' xpositions in this ff double CALC_AVG_VELOCITY(double kappa); void SET_FF_DATA(double ma, double fl_ang, double pres, double temp, double dens, int number); void SET_FF_PROPERTIES(bool mirror, double open_ang, double clos_ang); void SET_FF_POINTERS(Point* pPOO, Line* pOPL, Line* pCLL); void SEARCH_FOR_POINTS_IN_FLOW_FIELD(Time_Step* pTime_Step); void GIVE_FF_POINTLIST_TO_TS_POINTLIST(CTypedPtrList<CObList, Point*>* pPoint_List); double mach; double flow_angle; double pressure; double temperature; double density; //double kappa; double opening_angle; double closing_angle; double avg_velocity; bool first_flow_field; bool mirrored; //if the flowfield induces a mirrored calculation int flow_field_number; CTypedPtrList<CObList, Point*> point_list; //UM DIESE LISTE GEHT ES CTypedPtrList<CObList, Line*> line_list; Line* pOpening_Line; Line* pClosing_Line; Point* pPoint_of_Origin; Time_Step* pTS; };edit:
hier ein paar Fehlermeldungen von VS 2005:
HEAP CORRUPTION DETECTED: before Client block (#-1635531842) at 0x01748610.
CRT detected that the application wrote to memory before start of heap buffer.
Client located at 0x01748610 is 112 bytes long.
Eine Ausnahme (erste Chance) bei 0x00683fe8 in Sonicwaves.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xf8839149.
Unbehandelte Ausnahme bei 0x00683fe8 in Sonicwaves.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xf8839149.und
HEAP[Sonicwaves.exe]: Dedicated (0006) free list element 0174B4F0 is wrong size (055f)
Windows hat einen Haltepunkt in Sonicwaves.exe ausgelöst.Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in Sonicwaves.exe oder in einer der geladenen DLLs hin.
Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.
-
Entweder der this pointer oder prev_point ist ungültig!
Du hast wilde Zeiger in Deinem Programm die dann den Heap zerstören.