Wie kann ich den Fehler beheben? Programm stürt ab(Debug Ausgabe dabei)
-
Ich hab heute wieder mal an mein Browser weiter gemacht.
Nur ich kriege und kriege ein Fehler nicht weg.
Das Programm hatt eine TCppwebbrowser Komponente.
Und zur Laufzeit werden noch einige andere erzeugt.Das Programm stürzt aber in unregelmässigen Abständen ab.
Debug-Ausgabe: HEAP[Project1.exe]: Prozess Project1.exe (3048)
Debug-Ausgabe: HEAP: Free Heap block 2b8a000 modified at 2b8a020 after it was freed Prozess Project1.exe (3048)Schmeisst der als Antwort aus.
Codeteile die wichtig sein könnten.
TCppWebBrowser *WebBrowser[10]; int xy=1,fenster=0; //-----unwichtig if(Sender!=Browser) *Cancel = true; else { WebBrowser[fenster] = new TCppWebBrowser(this); //WebBrowser[fenster]->ParentWindow = Handle; WebBrowser[fenster]->Left=1; WebBrowser[fenster]->Top=ComboBox1->Top+ComboBox1->Height+3; WebBrowser[fenster]->Width=(Form1->Width-10)/4; WebBrowser[fenster]->Height=(Form1->Height-ComboBox1->Top-ComboBox1->Height-49)/4; //WebBrowser[fenster]->Navigate(WideString("http://www.freenet.de")); *ppDisp=WebBrowser[fenster]->Application; WebBrowser[fenster]->OnNewWindow2=BrowserNewWindow2; WebBrowser[fenster]->Hide(); //Browser->Show(); fenster++; } //erstellt neue Komponenten und resized die if(fenster-1<2) {xy++; SetToForeground(Form1->Handle); //unwichtig HWND test2handle=GetForegroundWindow(); char banana[256]; GetWindowText( test2handle, // handle of window or control with text banana, // address of buffer for text 255 // maximum number of characters to copy ); Label2->Caption=banana; } if(fenster-1>2 || fenster-1==2) { Timer3->Enabled=false; xy=0; closewindow->Enabled=true; } //maximal 3 weitere Komponenten erzeugen closewindow->Enabled=false; //alle instanzen killen //MessageBox(Handle,"alle geladen","alle geladen",MB_OK); for (int bfenster=0;bfenster<10;bfenster++) { if(WebBrowser[bfenster]!=NULL) { delete WebBrowser[bfenster]; } else { //evtl. noch was rein } } Timer1->Enabled=true; fenster=0; //Fenster wurde ne Zeitlang nicht genutzt und automatisch geschlossenUnd diesen 1 Fehler werde ich nicht los.
Meine Überlegung ist folgende, da der abundzu eine Fehlermeldung rausgab(JavaScript Problem Seite weiterhin ausführen etc.), das Programm aber die Komponente mit der obengenannte Methode versuchte zu killen. Das es evtl. dadran liegt.
Aber wie ich solche JavaScript Fehlerfenster richtig behandel um so, den Fehler evt. zu beheben weiss ich nicht.Hatt vielleicht einer so ein ähnliches Problem?
-
Hallo
benutzt den Debugger, um den Ablauf deines Programms und die Werte kritischer Variablen zu verfolgen.
Die Fehlermeldung deutet darauf hin, das du auf ungültigen Speicher zugreifst.bis bald
akari
-
Er stürzt ab mit der Fehlermeldung "Ungültige Zeigeroperation".
Aber was ist an den Zeigern falsch? Warum ist keine Struktur drin? Das eine mal stürzt er nach 10 Minuten ab das anderen mal nach 30 Minuten usw.
-
Hi,
ist in den Teilen, die du da zeigst, schwierig zu debuggen.
Deshalb zwischendrin nur mal geraten:if(WebBrowser[bfenster]!=NULL) { delete WebBrowser[bfenster]; }sollte ergänzt werden um solch eine NULLzuweisung:
if(WebBrowser[bfenster]!=NULL){ delete WebBrowser[bfenster]; WebBrowser[bfenster] = NULL; }Dann kannst du sicher sein, das dein pointer nach dem delete auch ein Nullpointer ist und der Vergleich beim nächsten mal funktioniert.
-
Hallo,
das hatte ich auch einmal, vergessen einen gelöschten Zeiger auf NULL zu setzen. Die Effekte sind sehr interessant, nur nicht vorhersehbar.
VG Pixfreak
-
Die Abfrage auf NULL vor dem delete ist unnötig.
Das Nullsetzen danach bringt auch nur dann etwas, wenn man vor der Verwendung jedesmal prüft ob der Zeiger evtl. Null ist.
-
@Braunstein:
Genau darum geht es ja.Richtigerweise prüft er ja vor dem DELETE schon auf einen NULL Pointer.
Richtig Sinn macht das allerdings erst ,wenn der Zeiger nach dem DELETE auch auf NULL gesetzt wird, so kann er für diesen Zeiger nicht noch einmal DELETE aufrufen.Natürlich muss man diesen Konstrukt konsequent nutzen, aber bei einem solchen Softwarekonstrukt, bei dem man immer wieder Objekte dynamisch erzeugt und löscht und und und, da macht es Sinn, sich die Zeit für eine solche Prüfung zu nehmen.
-
SilentSurfer schrieb:
Richtigerweise prüft er ja vor dem DELETE schon auf einen NULL Pointer...
Genau das habe ich moniert. Ein Test auf NULL vor einem delete macht keinen Sinn, da eine delete auf einen Nullzeiger zulässig ist. Wahrscheinlich macht das delete dann einfach gar nichts.
Wenn er statt dem Array auf Webbrowser einen vector nehmen würde, könnte man dort den Eintrag einfach löschen. So würde die Abfrage entfallen.
-
Bei einem DELETE auf einen NULL Pointer bin ich momentan etwas überfragt, ein DELETE auf ein (gültigen) Pointer eines freigegebens Objekt dagegen löst auf jeden Fall einen Fehler aus.
Er soll den NULL Pointer nur als Markierung dafür benutzen, das das Objekt schon gelöscht ist.
Was den Vektor betrifft, da hast du natürlich recht, das würde die Verwaltung der dynamischen Objekte vereinfachen.
-
SilentSurfer schrieb:
ein (gültigen) Pointer eines freigegebens Objekt
Das ist ein Widerspruch in sich.
SilentSurfer schrieb:
Er soll den NULL Pointer nur als Markierung dafür benutzen, das das Objekt schon gelöscht ist.
Das ist der Sinn des Nullsetzens, ja. Prüfen ist aber tatsächlich nur vor der Verwendung (ausgenommen delete) nötig.
Zum Thema: Ist das eine Compilerfehlermeldung oder zur Laufzeit? Kann mich nur dem Hinweis auf den Debugger anschliessen. In jedem Fall lässt sich bei einem Fehler im Debugger die exakte Zeile feststellen.
-
OK, zugegeben,
mit dem "gültigen" Pointer auf ein gelöschtes Objekt bin ich etwas über das Ziel hinausgelaufen.Was ich sagen wollte, war, das in
WebBrowser[bfenster]ein Zeiger vom Typ TCppWebBrowser steht.
Nach dem DELETE ist der Zeiger nicht mehr gültig, aber immer noch ein Zeiger vom Typ TCppWebBrowser, oder versteh ich das falsch?Auf diesen Zeiger darf kein DELETE mehr ausgeführt werden, daher vorher die Markierung.
-
Weshalb man sie ja nach dem delete null setzen sollte.... (o;
-
Danke junix,
war es nicht genau das, was ich am Anfang vorgeschlagen hatte?