Speicherverbrauch im Taskmanager -> Speicherleck
-
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.
-
So, ich habe jetzt noch probiert, den String in einen Struct zu packen und per Referenz zu übergeben, wobei der Anstieg des nicht freigegebenen Speicherverbrauchs nur merklich ist. Bei Funktionen, in denen ich einen <vector> vom Typ struct übergebe (auch wenn in dem Struct nur ein integer-Wert verwendet wird), steigt auch der verwendete Speicher stetig an.
Gibt es denn keine Möglichkeit, das zu umgehen? Es muß doch möglich sein, strings, vectoren und structs aus DLL zurückgeben zu können bzw. per Referenz mit ihnen zu arbeiten.

Ich habe auch schon probiert, die DLL statisch zu linken, allerdings brachte das auch nichts.