Speicherverbrauch im Taskmanager -> Speicherleck
-
Hallo Zusammen!
Der Speicherverbrauch meines Programmes steigt immer weiter an, irgendwo habe ich Fehler, die ich nicht finde. Leider ist mein Quellcode zu groß, um ihn zu posten. Ich suche allgemeine Ideen, wo ich noch nach Speicherlecks suchen kann.
Ich benutzte DLLs, häufig die Klassen strings, vector, fstream. Weiterhin Subclassing von Steuerelementen, die Verarbeitung für WM_CTLCOLORSTATIC habe ich auch herausgenommen, brachte allerdings nichts. Ansonsten habe ich keine Ideen mehr, da ich nicht einmal new/alloc verwende.
Wenn ich in meinem Programm Datensätze durchblättere, stelle ich diese in den Steuerelemente dar, wobei die einzelnen Funktionen in den DLLs wiederzufinden sind. Dabei habe ich allerdings pro Klick ca. 200-300 KB mehr im Speicher.
Hat jemand Ideen, an was das liegen könnte?
Danke
Steffen
-
Ich weiss nicht ob du es gemacht hast, aber generell sollten Klassen die du erzeugst, Speicher reservierst etc. nach dem Gebrauch wieder freigegeben werden.
class - delete
malloc - free
HeapAlloc/HeapAllocateEx - HeapFree(Ex)
VirtualAlloc(Ex) - VirtualFree(Ex)
...es gibt nichts besseres als die Vielfalt

Das solltest du auf jedenfall überprüfen, eventuell mit Strg+F nach den gegebenen Funktionen/Klassen/... suchen und überprüfen ob sie wirklich freigegeben werden.
-
Wenn das bei einem Klick passiert dann würd ich verfolgen was du auf einen Klick so alles machst und das erstmal testweise rausnehmen.
-
Klassen verwende ich keine, ich brauche nur <vector>-Variablen, um die Anwendungsdaten zu verarbeiten.
Ich habe auch schon versucht, einzelne Funktionen und Faktoren "abzuschalten" (siehe oben), aber es brachte leider auch nichts.
Vielleicht unterliege ich einem generellen Irrtum in der C++-Verarbeitung

Habt Ihr nicht noch ein paar Ideen, nach denen ich suchen könnte?
-
Zeig uns den Quelltext, auch wenn er lang ist.
-
Das sind über 30 DLLs mit jeweils bis zu 3000 Zeilen. Ich denke, das wird ein wenig viel. Ist halt ein sehr umfangreiches Projekt.
Ich find halt keinen Lösungsansatz mehr...
-
Lad dir das Programm BoundsChecker illegal runter (eMule) oder kauf es dir.
-
Durch Zufall kam mir noch ein Einfall - und gleich dazu die Frage: Weiß jemand, ob ich meine vector-Arrays erst mit erase() zurücksetzen muß, oder reicht es, clear() zu verwenden? Könnte das ein Speicherleck sein?
-
Was macht BoundsChecker?
-
http://www.compuware.com/products/devpartner/bounds.htm
Für C++ Fragen bist du hier im WinAPI Forum falsch.

-
@gs_zk_sed: versuch mal auto_ptr oder smart pointer einzusetzen! übernehmen dann automatisch das ein objekt am heap gelöscht wird!
verwendest du oft pointer um ein objekt am heap anzulegen?
cu
-
er hat doch geschrieben das er weder new noch mallow verwendet.
-
gs_zk_sed schrieb:
Wenn ich in meinem Programm Datensätze durchblättere, stelle ich diese in den Steuerelemente dar, wobei die einzelnen Funktionen in den DLLs wiederzufinden sind. Dabei habe ich allerdings pro Klick ca. 200-300 KB mehr im Speicher.
Hat jemand Ideen, an was das liegen könnte?
las dir mal im taskmanager dir gdi objekte anzeigen. vielleicht gibst du
diesen speicher nicht mehr frei
-
Erst einmal einen großen Dank an alle! Nach Tagen des Suchen habe ich ein "Leck" gefunden, weiß allerdings nicht, wie ich es beheben kann oder was ich falsch gemacht habe.
Ich erstelle DLL-Funktionen auf diese Weise:
__declspec(dllexport) string fFunction(string sString) { return string("TestString"); }In meinem Hauptprogramm rufe ich die DLL so auf:
HMODULE hMyLib_Fnc = LoadLibrary("function.dll") typedef string (* DLLProc_Fnc)(string sString); DLLProc_Fnc MyDLL_Fnc = NULL; MyDLL_Fnc = (DLLProc_Fnc)GetProcAddress(hMyLib_Fnc, "fFunction"); return MyDLL_Fnc("Test");Die Funktion wird problemlos ausgeführt, die DLL wird beim Programmstart geladen und erst zum Ende durch Freelibary entladen, da ich eine Funktion mehrmals benutzen möchte, ohne die DLL ständig zu laden/entladen.
Je öfter ich diese Funktion benutze und je größer der Rückgabestring ist, desto schneller wächst mein Speicherbedarf. Hat irgendjemand eine Idee, was ich falsch mache?
-
Sind alle DLLs und das Hauptprogramm gegen msvcrt.lib gelinkt (dynamic runtime)?
-
Nein, es sei denn DevCpp macht das automatisch. Ich habe das auch gerade ausprobiert, bringt leider auch nichts.
Habe ich vielleicht die Deklarationen falsch gesetzt, wenn ich auf die DLL-Funktionen zugreife? Ich habe alles schon unzählige Male kontrolliert, doch ich komme einfach nicht mehr weiter
Hat nicht irgend jemand einen Vorschlag für mich?

-
dlls und strings passen nicht gut zusammen, gibts glaub ich einen faq eintrag zu.
//edit zwar nich ganz faq, aber hier die infos:
http://www.c-plusplus.net/forum/viewtopic.php?t=67888&highlight=dll+string
-
Ich bekomme jedoch korrekte Strings aus der DLL zurückgeliefert, keine Compiler-Warnungen und Hauptprogramm<->DLL sind unter den gleichen Voraussetzungen kompiliert worden.
Soll es jetzt wirklich daran liegen? Wenn ja, vielleicht gibt es ja eine Möglichkeit, String als Rückgabetyp und Übergabeparameter dennoch zu nutzen...
-
Hat nicht jemand einen brauchbaren Link für mich, wie ich Strings und Structs dennoch bei DLLs verwenden kann? (Funktionieren tut es ja, aber der Arbeitsspeicher
)
-
Der Schein kann aber auch trügen. Vielleicht weiß irgendwer, ob man eine dynamische runtime mit devcpp verwenden kann. devcpp basiert doch auf mingw, soweit ich weiß, und dieses wiederum hat die Möglichkeit, msvcrt.lib zu verwenden.
Need more info!
Alles andere wäre bestenfalls "trickreich" bis umständlich.