Wie kann ich den Fehler beheben? Programm stürt ab(Debug Ausgabe dabei)



  • 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?


Anmelden zum Antworten