Speicherleck oder so ! (Problem für Könner)
-
Habe ein seltsames Problem.
Ich habe eine Anwendung geschrieben, in der ein paar Timer und Treads laufen.
Es werden verschiedenste Dialoge aufgerufen usw.
Eigentlich ist alles bei.Nun das Problem:
Wenn ich die Anwendung Starte wird der Speicher immer voller. Das entnehme ich dem TaskManager. Eigentlich sollt beim Start nicht viel passieren, aber irgendwiefüllt der sich halt.Aber damit nicht genug. Nach einer zeit (30 min - 2 Std) gibt es erst Zeichnungsfehler (Titelleiste nimmt hintergrundbilder auf alles verschiebt sich, usw). Bis das Prog schließlich abstürst (wahrschenlich speicher voll)
Kann mir jemand helfen?
Oder weiß jemand, ob ich im Debugmodus den Speicher überwachen kann, und sehe von welcher stelle er beschrieben wird?
-
Wenn du mit F5 startest und ohne Absturz beendest, was steht dann in der Ausgabe? Dort werden dir Speicherlecks gezeigt.
Ansonsten weiß ich keinen Rat.
-
Da steht nichts.
Das war auch das erste, auf das ich geachtet habe.Ist echt fieß die Geschichte.
-
Dann ist es Fleißarbeit. Sorry und mein Beileid.

Grr, falscher Knopf:
Also, guck ob du in keiner Datei Debugnew vergessen hast.#ifdef _DEBUG #define new DEBUG_NEWUnd DCs musst du wieder freigeben, sonst springt er auch in die Bresche...
naja, den Rest Tips mit "Hast du für jedes new auch ein delete" solltest du ja kennen.

Viel Erfolg
-
Sieh mal im taskmanager nach was genau das hoch zählt. Nur die Speichernutzung oder auch Handles, Threads, GDI-Objecte, ect?
-
Habe was gefunden.
Ich habe folgendes in einem Timer.CButton *ErrBut = (CButton*)GetDlgItem(IDC_FEHLER_GM); ///////////////////////////////////////////// // Fehlerlicht ein- ausblenden if(m_pBasis->m_bAktiverFehler == true) { bitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_ROT)); bitmap2 = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL)); GetMainWindow()->UpdateWinMainData(); } else { bitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL)); bitmap2 = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_GRUEN)); GetMainWindow()->UpdateWinMainData(); } ErrBut->SetBitmap(bitmap);Muß ich da Irgendwas deleten?
-
ein DeleteObject wenn die bitmap nicht mehr beötigt wird wäre sicher nicht schlecht.
-
Also in etwa so!?
.
..
...GetMainWindow()->UpdateWinMainData(); } else { bitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL)); bitmap2 = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_GRUEN)); GetMainWindow()->UpdateWinMainData(); } ErrBut->SetBitmap(bitmap); DeleteObject(bitmap);
-
Hmm.
Ich habe jetzt dasDeleteObject(bitmap);eingebaut, aber dennoch wird der Speicher weiter belastet.
Ich schreibe einfach mal den kompletten Quelltext hier rein, vielleicht hat jemand ne Idee.
void CTestDlg::OnTimer(UINT nIDEvent) { HBITMAP bitmap,bitmap2; CButton *BusyBut; bitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_GRUEN)); bitmap2 = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL)); bool bProgrammeNichtImAutomodus=true; long lWert; CString str; // ST-Fenster schließen falls Admin angemeldet ist und Progfenster offen. CPassword Passwort; if (Passwort.isLeader () && m_pActualStationDlg!= NULL && m_pActualStationDlg->m_pProgDlg!= NULL) if( m_pActualStationDlg->m_pProgDlg->IsWindowVisible() == true) m_pActualStationDlg->ShowWindow(SW_HIDE); if(m_pActualStationDlg!=NULL) m_pActualStationDlg->ChangeStatus(); for(int i=0;i<m_pBasis->m_iStationsAnz;i++) { BusyBut = (CButton*)GetDlgItem(IDC_BUSY1 + i); if(( (*((m_pBasis->m_ppStation)+i))->m_programm.IsProgramRunning())) { BusyBut->SetBitmap(bitmap); bProgrammeNichtImAutomodus=false; } else BusyBut->SetBitmap(bitmap2); } if(bProgrammeNichtImAutomodus) m_ctlZyklusende.SetCheck(false); (*((m_pBasis->m_ppStation)+4))->ProzessdatenLesen(1, &lWert); commafmt(str.GetBuffer(20), 20, lWert); GetDlgItem(IDC_EDIT11)->SetWindowText(str); (*((m_pBasis->m_ppStation)+4))->ProzessdatenLesen(2, &lWert); commafmt(str.GetBuffer(20), 20, lWert); GetDlgItem(IDC_EDIT12)->SetWindowText(str); BOOL bVal; m_pBasis->m_digitalio.m_AtnData.LeseEingang(7, bVal); if( bVal == 1) { for (int i=0 ; i < 5 ; i++) (*((m_pBasis->m_ppStation)+i))->m_programm.SetProcessStopFlag( true); } else { for ( i=0 ; i < 5 ; i++) (*((m_pBasis->m_ppStation)+i))->m_programm.SetProcessStopFlag( false); } CButton *ErrBut = (CButton*)GetDlgItem(IDC_FEHLER_GM); ///////////////////////////////////////////// // Fehlerlicht ein- ausblenden if(m_pBasis->m_bAktiverFehler == true) { bitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_ROT)); bitmap2 = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL)); GetMainWindow()->UpdateWinMainData(); } else { bitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(NULL)); bitmap2 = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_GRUEN)); GetMainWindow()->UpdateWinMainData(); } ErrBut->SetBitmap(bitmap); DeleteObject(bitmap); CDialog::OnTimer(nIDEvent); }Hoffe es ist alles klar!
-
CMatt schrieb:
Sieh mal im taskmanager nach was genau das hoch zählt. Nur die Speichernutzung oder auch Handles, Threads, GDI-Objecte, ect?
Das Problem besteht immernoch ,und ich habe ein echtes Problem mit den GDI Objekten.
Welche sich das? Und warum zählen die hoch?
-
OK.
Danke an die diemir geholfen haben.
Manchmal brauch man nur nen denkanstoß.Danke CMatt
Habe folgendes vergessen:
pDC->DeleteDC(); pDC = NULL;Blöd aber verhängnisvoll