Seite 1 von 1
[gelöst]delete verursacht "read access violation at 0x0"
Verfasst: 19. Mai 2013 15:38
von ThunderStorm
Hi,
wenn ich in einer Memberfunktion eines QGraphicObjects den Speicher eines anderen QGraphicsObjects frei gebe und den Zeiger dann auf NULL setze (was, glaube ich nicht nötig wäre):
Code: Alles auswählen
void Bac::advance(int)
{
qDebug()<<"Bac::advance()";
//...
qDebug()<<"ZReag löschen... ";
delete zielFutter->ZReag;
qDebug()<<"Speicher von ZReag freigegeben!";
zielFutter->ZReag = NULL;
//...
qDebug()<<"Ende von Bac::advance()";
}
Ich überprüfe im Code weiter oben, ob ich auch sicher keinen NULL Zeiger dereferenziere, aber dennoch bekomme ich folgenden Fehler:
Code: Alles auswählen
Fehler:Exception at 0x59e168f7, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)
Datei: moc_mainwindow.cpp
Code: Alles auswählen
// SIGNAL 0
void MainWindow::advance()
{
qDebug()<<"In MOC-File vor dem Aufruf von activate()";
QMetaObject::activate(this, &staticMetaObject, 0, 0); //Fehler hier
qDebug()<<"In MOC-File nach dem Aufruf von activate()
}
QT_END_MO
Ich hatte ähnliche Probleme bereits öfter:
Darum, was bedeutet der Fehler eigentlich? (access violation at 0x0 heißt doch eigentlich, dass ich auf ein Objekt an der Speicheradresse NULL lesend zugreifen will, was natürlich nicht möglich ist)
Und liegt der Fehler wirklich dort, wo mir der Debugger das anzeigt, oder irgendwo in meinem Code-Abschnitt?
Bzw. was ist mein Fehler?
Re: delete verursacht "read access violation at 0x0"
Verfasst: 19. Mai 2013 15:48
von veeman
Wenn irgendwelche Events getriggert wurden und noch nicht abgearbeitet wurden und du während dessen das Objekt löscht kann es durch aus zu einer ungültigen Adresse führen, wenn die Events im nachhinein verarbeitet werden.
Ist dies vielleicht der Fahl bei dir?
Re: delete verursacht "read access violation at 0x0"
Verfasst: 19. Mai 2013 16:53
von ThunderStorm
Ich habe eigentlich keine eigenen Event-Funktionen, oder gibt es auch vererbte Events, bei denen das Problem auftreten kann?
Das einzige was mir einfällt ist, dass ZReag (also, das zu löschende Objekt) von der GraphicsScene über eine Signal-Slot-Verbindung einen Wert erhält, wie lange die Maus gedrückt ist.
Muss ich die Verbindung vor dem Löschen dann auflösen oder macht Qt das selbst?
Edit:
Auch wenn ich statt delete deleteLater() verwende, bekomme ich den gleichen Fehler, obwohl deleteLater() -laut Qt- erst ein Objekt löschen soll, wenn alle ausstehenden Events abgearbeitet wurden.
Re: delete verursacht "read access violation at 0x0"
Verfasst: 20. Mai 2013 19:32
von veeman
Alle gültigen Verbindungen werden beim löschen eines Objekts von Qt automatisch getrennt. Das Problem wird wohl an einem nicht Qt-Objekt sprich einer Instanz liegen die nicht mit Qt gekoppelt ist.
Ein paar Grundlegende sachen schon geprüft?
-> Ist der Pointer zielFutter gültig, wird dieser irgendwo genullt?
-> Ist bei der Problemzeile this bzw. staticMetaObject gülltig?
-> Hast du ggf irgendwo einen Pufferüberlauf?
-> Am besten mal noch einige qDebug Anweisungen platzieren um das Problem zu finden.
Re: delete verursacht "read access violation at 0x0"
Verfasst: 26. Mai 2013 17:09
von ThunderStorm
Hallo veeman,
danke für deine Antwort.
- Der Zeiger zielFutter ist gültig.

ch hab den Wert von zielFutter kurz vor dem Aufruf von delete abgefragt, und der Wert war ungleich NULL)
- this und &staticMetaObject sind ebenfalls nicht NULL
- Von einem Pufferüberlauf ist mir nichts bekannt

ch verwende keine Arrays, sondern QList, QString, etc...)
Der Ablauf kurz vor dem Fehler sieht so aus: (Mit qDebug ausgegeben)
Code: Alles auswählen
In MOC-File vor dem Aufruf von activate() // Mit activate() ruft scheinbar die GraphicsScene von jedem Item den advance()-Slot auf
Reagenz::advance() //Bei dem zu löschendem Objekt wird advance() aufgerufen
Bac::advance() //In einem anderem Item wird advance() gestartet
ZReag löschen... // daraufhin passieren etliche Sachen und schließlich wird "delete zielFutter->ZReag;" aufgerufen
Reagenz Destruktor //Dann wird der Destruktor von ZReag aufgerufen
Speicher von ZReag freigegeben! //und der Speicher wird freigegeben
Ende von Bac::advance() //Das Ende von Bac::advance() wurde erreicht, darum: Rücksprung zum Aufrufer
(--> Vermutlich: Rücksprung zu QMetaObject::activate)
//Jetzt Fehler und Absturz
Ich habe jetzt noch bei allen Code-Abschnitten im Foren-Thread die qDebug()-Ausgaben eingefügt.
Mit freundlichen Grüßen,
ThunderStorm
Re: delete verursacht "read access violation at 0x0"
Verfasst: 28. Mai 2013 09:42
von veeman
Sehe grad das du das Objekt in der advance Funktions löscht. In der Doku steht:
This virtual function is called twice for all items by the QGraphicsScene::advance() slot. In the first phase, all items are called with phase == 0, indicating that items on the scene are about to advance, and then all items are called with phase == 1. Reimplement this function to update your item if you need simple scene-controlled animation.
Die Funktion wird zwei mal Aufgerufen für alle Objekte. Ich denke es ist unklug ein Zeichenobjekt in dieser Methode zu löschen, da offensichtlich darauf nach dem Löschen noch irgendwo zugegriffen wird. (ggf erst in Phase 1 löschbar)
Ich denke deleteLater sollte der richtige Ansatz sein, jedoch darfst du wahrscheinlich das Objekt nicht direkt Nullen, sondern erst wenn die Funktion aufgerufen wird.
//Edit: Hast du vl ein minimales Codebesipiel-/projekt wo der Fehler auftritt?
Re: delete verursacht "read access violation at 0x0"
Verfasst: 29. Mai 2013 14:52
von ThunderStorm
Danke veeman,
nachdem ich jetzt advance() so geändert habe, war das Problem immer noch da.
Aber als ich dann delete durch deleteLater() ersetzt habe, ließ sich der Fehler nicht mehr reproduzieren.
So einen harnäckigen Fehler hatte ich noch nie...

Nochmal vielen Dank.
Mit freundlichen Grüßen,
ThunderStorm