Zugriffsverletzung beim Beenden
-
Ich bekomme eine Zugriffsverletzung beim Beenden des Programmes. Diese bekomme ich aber nur wenn ich das Programm aus dem BCB heraus starte. Kompiliere ich endgültig läuft es ohne Probleme und auch das Beenden klappt.
Habs schon mit Codeguard und versucht. Ohne Ergebnis.
Beim Debuggen bleibt er in der Close() Behandlung beim Destruktor hängen.
Ein paar Destruktoren werden aufgerufen, aber der letzte für Hauptform nicht.
Hat jemand eine Idee woran das liegen könnte ??
---------------------------
Information
---------------------------
In Projekt C:\Program Files\Borland\CBuilder6\Projects\Praktikant\Partikel Counter Alarm 2\ParticleCounterAlarm.exe trat ein Problem mit folgender Meldung auf: 'Zugriffsverletzung bei 0x004d7dff: Schreiben von Adresse 0x00030ffc'. Prozeß angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------FGGF
PS: Oder wie geht man so ein Problem an ??
@ junix: http://www.kristallkugeln.net/
-
Frägelchen: Hast du irgendwelche globalen Variablen, auf die du zugreifst in den Destruktoren oder so?
-junix
P.S: Danke für den Link, aber keine Kristallkugel kann meine alte ersetzen )o:
-
Einen Pointer auf ne TListBox, die anderen globalen Variablen meiner Klassen werden im eigenen Destruktor alle aufgerufen und gelöscht. Es gibt erst Probleme sobald er an die TForm-Destruktoren geht. Bis zum letzten Destruktor der Mainform schafft er es nicht mehr. Ich muss mein Programm jetzt mit ExitThread oder EndThread beenden. Scheisse.
Ich hab ne Idee worans liegt, aber keine Ahnung warum.for(i=0; i<(this->Autodaten.GetTemperaturCount()->Count); i++) { konvert=StrToInt(this->Autodaten.GetTemperaturCount()->Strings[i]); if(konvert==(this->Autodaten.GetMyTime()->Count-1)) AlarmCounter++; }
GetTemperaturCount liefert einfach ne TStringList zurück, bzw. nen Pointer auf die StringListe. GetMyTime ist ebenfalls ne TSL. In de ersten TSL stehen Integerwerte. Wenn einer der Integerwerte gleich der Gesamtzeilenzahl-1 der TSL GetMyime ist wird der AlarmCounter erhöht.
Count fängt bei 1 mit Zählen und die Strings der TSL bei 0. Mache ich hier irgendwas falsch und ein String kann eventuell nicht aufgerufen werden ??FGGF
-
Was ist "Autodaten"? Und du bist dir schon bewusst, dass du da Speicherlecks produzierst mit deinem code?`Btw. Was passiert wohl z.B. wenn die Funktion NULL zurückliefert statt nem gültigen Zeiger auf die Stringlist? Und wozu rufst du jedesmal die Funktion neu auf um das Resultat auszuwerten? Bist du dir bewusst, dass du da jedesmal andere Resultate bekommen kannst?
-junix
-
Also kurze Erklärung:
Ich werte eine Logbuch-Datei aus. Diese ändert sich alle 10 bis 15 Minuten, deshalb muss die Funktion jedesmal neu aufgerufen werden, da die Daten sich ändern. Die StringList ist auf jeden Fall vorhanden, da sie auf jeden Fall erzeugt wird. Es kann also höchstens die TSL selbst leer sein.#ifndef ThreadH #define ThreadH //============================================================================= #include <Classes.hpp> #include "datafile.h" #include "showalert.h" //============================================================================= class My_Thread : public TThread { private: void AuswerteEinheit(); protected: void __fastcall Execute(); public: __fastcall My_Thread(bool CreateSuspended); DataFile Autodaten; }; //============================================================================= #endif
Ich hoffe du kapierst was ich mit Autodaten bezwecke. Nicht das du zu doof wärst es zu kapieren, ich bin zu doof es anders zu erklären.
In Datafile wird die Datei eingelesen und an die Klasse Temperatur übergeben.
Dort wird sie ausgewertet und die Funktion GetTemperatutCount liefert dann einen Pointer auf die dort erzeugte StringListe mit den Werten zurück.
Diese TSL enthält einfach die Zeilenangaben in der ein Fehler auftrat.TStringList* Temperatur::AnalyseTemperatur(void) { // System-Trenner merken und auf '.' ändern int i; float tmin, tmax, tdatei; char SystemDecimalSeparator; // TIniFile *ini; // ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" )); SystemDecimalSeparator=DecimalSeparator; DecimalSeparator='.'; tmin=ini->ReadInteger("newTemperatur","min", 22); tmax=ini->ReadInteger("newTemperatur","max",24); this->SL_Temperatur_Auswertung->Clear(); this->SL_Count_Temperatur->Clear(); for (i=0; i<(SL_Temperatur->Count); i++) {// tdatei=StrToFloat(SL_Temperatur->Strings[i]); if (tdatei < tmin || tdatei >tmax) {// this->SL_Temperatur_Auswertung->Add(SL_Temperatur->Strings[i]); this ->SL_Count_Temperatur->Add(i); // hier werden die Integerwerte geschrieben } } // Trennzeichen wieder zurücksetzten DecimalSeparator=SystemDecimalSeparator; // Und Tschüss if(ini) delete ini; return this->SL_Temperatur_Auswertung;
TStringList* Temperatur::GetTemperaturCount(void) {// return this->SL_Count_Temperatur; }
Wenn nun eine Abweichung in der letzten Zeile auftritt ist der Wert der in der TSL steht genauso hoch wie der der MaximalZeilen von GetMyTime->Count.
D.h. der Fehler ist aktuell. Alte Fehler interessieren mich nicht.Ich hoffe ich habe es nicht zu kompliziert erklärt.
FGGF
Edit1: Die Zugriffsverletzung tritt nur auf, wenn in der letzten Zeile eine Abweichung vorhanden ist, sonst gibt es beim Beenden kine Zugriffsverletzung.