sehr langsames Beenden von Programmen
-
Hallo
Hmm. So etwas dachte ich mir schon, nur fordere ich eigentlich keinen Speicher per new an. zumndest nicht direkt. Ich werde jetzt mal nachschauen, ob ich es irgendwo indirekt tue.
chrische
-
Schreib mal ein
#define new DEBUG_NEWan den Anfang deines Programms, dann kannst du schonmal einschränken, wo der Speicher verbraten wird. Wenn das zu ungenau ist, solltest du einen Leak-Detektor anschaffen.(aber von der Größe und Belegung sieht es ganz danach aus, als ob du den Fehler auf eine einzige Funktion einschränken kannst, die sehr oft in Schleife ausgeführt wird)
-
Hallo
Ind der ProgrammNameDlg.cpp steht bereits:
#ifdef _DEBUG #define new DEBUG_NEW #endifWas bringt das eigentlich?
chrische
-
Das ersetzt das 'new' im Programmtext durch 'DEBUG_NEW' (und das führt wiederum zur Verwendung des 'operator new(size_t,char*,int)', der die Datei und Zeile aller new-Aufrufe mitprotokolliert. Setz mal dieses #define in die stdafx.h, damit diese Änderung vom GESAMTEN Programm übernommen wird.
-
Hallo
Wenn ich das mache, bekomme ich sehr viele Fehlermeldungen. Unter anderem:
error C2833: 'operator DEBUG_NEW' is not a recognized operator or type
chrische
-
Dann hast Du kein MFC Programm oder afx.h wurde nicht inkludiert!
BTW:
Die Ziffer in der geschweiften Klammer gibt die Allokationsnummer an. D.h. die wievielte Allokation es war.
Wenn die Debug Ausgabe immer ziemlich ähnlich ist. Also Deine Allokationen immer so um die 2700 als Leak gemeldet werden, dann kannst Du mit_CrtSetBreakAlloc(2700);bei Programmstart das Programm bei der 2700 Allokation in den Debugger breaken lassen.
Dann schaust Du Dir den Stacktrace an und wirst weise...
-
Hallo
Es scheint an diesen Funktionen zu liegen. Da ich aber nicht weiß, wo hier der Fehler sein soll, lasse ich mal die Hosen runter und zeige meinen Code. Ich hoffe, dass er nicht allzu verfrickelt ist:
bool chrische::Data::LoadCountriesFromFiles() { chrische::EditorCountry Temp; CString FileName; CString Count; CStdioFile FileToReadOut; CString TempString; for(int i=0; i<chrische::GetIni()->GetInt(_T("Load"), _T("CountCountries"), 0); ++i) { FileName = chrische::GetIni()->GetString(_T("Directories"), _T("CountryDirectory")); Count.Format(_T("%d"), i+1); FileName += _T("01")+ Count + _T(".cou"); FileToReadOut.Open(FileName, CStdioFile::modeRead); if(!FileToReadOut) return false; else { FileToReadOut.ReadString(TempString); Temp.SetName(TempString); FileToReadOut.ReadString(TempString); Temp.SetNationalAssociation(TempString); FileToReadOut.ReadString(TempString); Temp.SetInternationalAssociation(_wtoi(TempString.GetBuffer())); FileToReadOut.ReadString(TempString); Temp.SetID(TempString); Countries.Add(Temp); } FileToReadOut.Close(); } return true; } bool chrische::Data::LoadLeaguesFromFiles() { CString Count; CString Te; CStdioFile FileToReadOut; CString FileName; chrische::EditorLeague Temp; for(int i=0; i<chrische::GetIni()->GetInt(_T("Load"), _T("CountLeagues"), 0); ++i) { FileName = chrische::GetIni()->GetString(_T("Directories"), _T("LeaguesDirectory")); Count.Format(_T("%d"), i+1); FileName += _T("02")+ Count + _T(".lea"); FileToReadOut.Open(FileName, CStdioFile::modeRead); if(!FileToReadOut) return false; else { FileToReadOut.ReadString(Te); Temp.SetName(Te); FileToReadOut.ReadString(Te); Temp.SetParentCountry(Te); FileToReadOut.ReadString(Te); Temp.SetID(Te); FileToReadOut.ReadString(Te); Temp.SetNumberOfUpTeams(_wtoi(Te.GetBuffer())); FileToReadOut.ReadString(Te); Temp.SetNumberOfDownTeams(_wtoi(Te.GetBuffer())); FileToReadOut.ReadString(Te); Temp.SetNumberOfTeams(_wtoi(Te.GetBuffer())); FileToReadOut.ReadString(Te); Temp.SetPriority(_wtoi(Te.GetBuffer())); AllLeagues.Add(Temp); } FileToReadOut.Close(); } return true; } bool chrische::Data::LoadCountryNamesFromFile() { CStdioFile FileToReadOut; FileToReadOut.Open(chrische::GetIni()->GetString(_T("Directories"), _T("CountryNamesDirectory")) + chrische::GetIni()->GetString(_T("FileNames"), _T("CountryNamesFileName")), CStdioFile::modeRead); if(FileToReadOut) { CString Temp; while(FileToReadOut.GetPosition() != FileToReadOut.GetLength()) { FileToReadOut.ReadString(Temp); AllCountryNames.Add(Temp); } return true; } else return false; } bool chrische::Data::LoadPlayerNamesFromFile() { CStdioFile FileToReadOut; FileToReadOut.Open(chrische::GetIni()->GetString(_T("Directories"), _T("PlayerNamesDirectory")) + chrische::GetIni()->GetString(_T("FileNames"), _T("PlayerNamesFileName")), CStdioFile::modeRead); if(FileToReadOut) { CString Temp; while(FileToReadOut.ReadString(Temp)) { PlayerNames.Add(Temp); } return true; FileToReadOut.Close(); } else return false; } bool chrische::Data::LoadPlayerSurNamesFromFile() { CStdioFile FileToReadOut; FileToReadOut.Open(chrische::GetIni()->GetString(_T("Directories"), _T("PlayerSurnamesDirectory")) + chrische::GetIni()->GetString(_T("FileNames"), _T("PlayerSurnamesFileName")), CStdioFile::modeRead); if(FileToReadOut) { CString Temp; while(FileToReadOut.ReadString(Temp)) { PlayerSurNames.Add(Temp); } return true; FileToReadOut.Close(); } else return false; } bool chrische::Data::LoadCoachesFromFile() { CStdioFile FileToReadOut; CString FileName; CString Count; CString TempString; chrische::EditorCoach TempCoach; for(int i=0; i<chrische::GetIni()->GetInt(_T("Load"), _T("CountCoaches"), 0); ++i) { FileName = chrische::GetIni()->GetString(_T("Directories"), _T("CoachDirectory")); Count.Format(_T("%d"), i+1); FileName += _T("05") + Count + _T(".coa"); FileToReadOut.Open(FileName, CStdioFile::modeRead); if(!FileToReadOut) return false; else { FileToReadOut.ReadString(TempString); TempCoach.SetName(TempString); FileToReadOut.ReadString(TempString); TempCoach.SetSurName(TempString); FileToReadOut.ReadString(TempString); TempCoach.SetStrength(_wtoi(TempString.GetBuffer())); FileToReadOut.ReadString(TempString); TempCoach.SetType(_wtoi(TempString.GetBuffer())); FileToReadOut.ReadString(TempString); TempCoach.SetFamilyStatus(_wtoi(TempString.GetBuffer())); FileToReadOut.ReadString(TempString); TempCoach.SetNationality(TempString); FileToReadOut.ReadString(TempString); TempCoach.SetBirthYear(_wtoi(TempString.GetBuffer())); FileToReadOut.ReadString(TempString); TempCoach.SetID(TempString); FileToReadOut.ReadString(TempString); TempCoach.SetIsInJob(_wtoi(TempString.GetBuffer())); AllCoaches.Add(TempCoach); } FileToReadOut.Close(); } return true; }Die Klasse Data ist ein Singleton. Vieleicht hängt es ja damit zusammen.
Vielen Dank
chrische
-
Hallo
Ich wollte nun Erfolg vermelden. Ich habe nun noch einmal intensiv gesucht und den visual leak detector von codeproject.com zur Hilfe gebeten und gemerkt, dass ich vergessen hatte die Singleton auch wieder zu löschen.
Danek für die Hilfe
chrische
-
Was soll denn das Gehampel mit GetBuffer?
-
Hallo
Ich dachte, dass das nur so geht und werde es aber jetzt gleich ändern.
chrische
-
GetBuffer kann nichts damit zu tun haben. In diesem Bereich sehe ich kein Leak.
Hier wird weder new, noch malloc verwendet. Die Strings sind alle sicher, selbst wenn GetBuffer verwendet wird.Ich tippe eher auf die Objekte in denen die CString's liegen, die nicht freigegeben werden. Aber das sehen wir nicht wie die angelegt und freigegeben werden!
-
Hallo
@MartinRichter
Das mit GetBuffer() hat natürlich nichts damit zu tun. Ich hatte bereits geschrieben, dass ich vergessen hat, das Singleton beim Beenden des Programmes zu löschen und da in diesem Singleton eine Menge Daten lagern, gab es diese Unmenge an Memory Leaks.
Vielen Dank für eure Hilfe.
chrische