Nach Prozedurende erfolgt absturz
-
Meiner Meinung nach kann es nicht sein, dass ich etwas 2.Mal gelöscht habe.
In SaveData() mache ich ein SafeDelete(pointer) von dem Pointer mit dem Datenbankobjekt, das heißt das passt auf jeden Fall und es ist ja auch auskommentiert und ansonsten erzeuge ich ja kein Objekt mit new().
-
void CTestDoc::InsertZeichenDialog(){ SetData sd; if(sd.DoModal() == IDOK) sd.OnOk(); -- hier kommt das Programm nicht mehr vorbei, es stürzt vorher ab! }Das ist doch vollkommener Unsinn.
Du erzeugst enen Dialog auf dem Stack. Wenn der Dialog aus DoModal zurückkehrt isr der Diaog natürlich sachon abgearbeitet, dass heißt m_hWnd ist NULL. der Aufruf von sd.OnOK(); muss zum Crash führen!
-
Meiner Meinung nach kann es nicht sein, dass ich etwas 2.Mal gelöscht habe.
In SaveData() mache ich ein SafeDelete(pointer) von dem Pointer mit dem Datenbankobjekt, das heißt das passt auf jeden Fall und es ist ja auch auskommentiert und ansonsten erzeuge ich ja kein Objekt mit new().ich habe dann mal in der SetData::OnOk() alles rausgeworfen außer OnDialog() OnOk() aufrufe und es erfolgt trotzdem der gleiche Fehler.
void SetData::OnOk(){
CDialog::OnDialog();CDialog::OnOk();
}Nur wenn die Methode leer bleibt, dann tritt wie erwartet keinerlei Fehler auf!
-
Ok klingt verständlich denke mal genauer drüber nach, hatte deine Nachricht noch nicht gesehen!
-
Ja, du hast recht ... Danke! ... weißt du wie dieser Dialogaufruf fehlerfrei gestaltet werden kann?
-
ich habe jetzt sd.OnOk(); weggelassen und dann funktioniert es natürlich. Danke für die Hilfe ich habe es nicht mehr gesehen...
-
Hab mich zu Früh gefreut, leider ist immer noch das gleiche Verhalten erkennbar, das Programm stürzt an der genannten Stelle ab und kehrt auch nicht aus DoModal() Aufruf zurück.
-
Also aufgerufen wird dein Dialog noch korrekt oder? Dann auf einen Klick auf den OK-Button stürzt es ab? Hast du an dem OK Button was verändert, also zB eine OnOK-Funktion direkt zum Dialog hinzugefügt die aufgerufen wird oder ist das noch der normale OK-Button der vom Assistent eingefügt wird?
-
Also ich kann mir nicht vortsllen, dass diese Fehler nbicht in der Debug Version zu einem ASSERT geführt haben...
Bekommst Du wirklich keinen ASSERT?
-
Ja der Dialog wird korrekt aufgerufen und nach der OnOK() Methode meiner SetData Klasse bleibt der Debugger mit der Fehlermeldung stehen:
Benuzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x....
Noch mal zusammenfassend:
void CTestDoc::InsertZeichenDialog(){
SetData sd;
sd.DoModal();
-- diese Stelle erreicht mein Programm nicht mehr, es stürzt vorher ab!
}void SetData::OnOk(){
CDialog::OnOk();
}Prinzipieller Ablauf von dem ich ausgehe:
Mit einem angelegtem Objekt… .doModal(); aufrufen, dies öffnet den Dialog.
Wenn nun dieser Dialog mit einem Klick auf den OK Button beendet wird, dann befindet sich das Programm in der OnOK() Methode. Der Aufruf CDialog::OnOK(); in der OnOK() Methode schließt dann den Dialog wieder und der Programmablauf geht nach doModal() weiter.
-
Ich habe jetzt noch mal in der SetData Klasse nach vorhandenen Störquellen gesucht und dabei ist mir diePostNcDestroy() Methode die mein Vorgänger eingefügt hat aufgefallen, ich hab sie daraufhin auskommentiert und nun stüzt mein Programm nicht mehr ab. Es funktioniert jetzt, aber ich kann den Zusammenhang nicht nachvollziehen???
Was ich momentan weiß ist, dass er nach dem beenden der OnOk() Methode in die PostNcDestroy() hineinsteigt.
-
PostNcDestroy wird automatisch aufgerufen, nachdem das Fenster bzw. der Dialog eine WM_NCDESTROY-Nachricht erhalten hat. Was wurde denn in PostNcDestroy noch gemacht?
-
Es wurde bloß "delete this" und "CDialog::PostNCDestroy()" aufgerufen und deshalb ist mir beim Compilieren das Programm danach abgestürzt.
-
Mit
delete this;wird das Dialogobjekt nach dem Schließen des Fensters automatisch gelöscht. Das funktioniert aber nur bei dynamisch erstellten Dialogen mit
CMyDialog* pDialog = new CMyDialog;Bei auf dem Stack erzeugten Dialogen (wie bei Dir) endet es aber ganz böse, weil es hier nichts zu löschen gibt. Das Ergebnis ist dann eine Zugriffsverletzung.