Seite 1 von 2
Speicherlecks finden?
Verfasst: 29.01.2006 16:36
von Konne
Hallo erstmal zusammen. ICh hzabe ein Programm geschrieben, wenn ich es jetzt laufen lasse und mir den Speicherverbrauch ansehen, bemerke ich dass er kontinuiertlich steigt. Bin ich da jetzt dran schuld oder ist das unter Windows halt so? WEenn ich dran schuld bin, wie finde ich so einen Fehler dann am schnellsten. (ca 6000 Zeilen Code)
Verfasst: 29.01.2006 16:44
von Tafkadasom2k5
Schreib in die Prozedur, die was in den Speicher läd, eine Debug-Message rein, woran du siehst, wie oft er das macht.Damit kannste unter Umständen ungewollten rekursiven Aufrufen auf die Schliche kommen..
Nur sone stumpfe Idee...
Verfasst: 29.01.2006 16:44
von remi_meier
Normalerweise bist du dann dran schuld
Such nach AllocateMemory() und verfolge ab da den Programmablauf,
du musst sicher sein, dass du auch FreeMemory() benutzt! Oft ist auch
ein ReAllocateMemory() nützlicher als ein AllocateMemory()!
Ich würde mir ein einheitliches System überlegen, damit z. B. wenn du
einen Pointer an eine Prozedur übergibst, dass KEINE Prozedur den
Speicher, der ihr übergeben wurde, frei gibt. Es muss also durch den
Aufrufer geschehen. Machs einfach einheitlich. Ich machs immer so, wie
ichs oben beschrieben hab.
greetz
Remi
Verfasst: 29.01.2006 20:05
von Konne
Danke für die Tipps. Ich machs grad so, dass ich immer codeteile ausdokumentiere und dann seh ich (hoffendlich) wo es auftritt.
Verfasst: 29.01.2006 20:52
von Konne
Warum zur Hölle geht das bei mir nicht???
Also folgender Code stürtz bei mir ohne Debugger ab und mit Debuger steigt der Speicherverbrauch kontinuierlich. Aber warum nur?
Das hier sind mal die 2. Codes. Das untere ist die Dll das obere das Programm.
Code: Alles auswählen
If OpenLibrary(1,"dll.dll")
Buf=IsFunction(1,"Free")
For t = 1 To 10000
*Point=CallFunctionFast(Buf)
FreeMemory(*Point)
Delay(1)
Debug "!"
Next
EndIf
Beep(100,100)
Code: Alles auswählen
ProcedureDLL Free()
*Buf=AllocateMemory(4)
ProcedureReturn *Buf
EndProcedure
Wenn mal einer schauen könnte ob bei ihm das gleiche Ergebnis herauskommt würde mich das sehr freuen.
Verfasst: 29.01.2006 20:59
von armada
hmm keine ahnung warum des mit der dll nicht geht...als prozedur bleibt bei mir der benötigte ram für das proggi konstant
also kannste es vielleicht mal ohne dll versuchen...dann sollte es ja normal bei dir auch gehen
mfg
armada
p.s.: also ich hab v3.94
Verfasst: 29.01.2006 21:30
von remi_meier
Die DLL ist wie eine eigene Exe (z. T. zumindest), somit sind die Memory-
Funktionen, die du in der DLL benutzt nicht die 'gleichen' wie die im Programm. Du musst also jedes Memory, dass du in der DLL erstellst,
auch in der DLL wieder löschen! (oder eine Funktion in der DLL, die du
dann aufrufen kannst um den Speicher zu löschen) Umgekehrt auch für
das Hauptprogramm.
FreeMemory() schlägt hier fehl!
Verfasst: 29.01.2006 21:52
von Konne
Ich dachte immer die Speicherverwaltung würde von Windows übernommen werden. Wie ist das dann bei Strings oder Variablen die ich zurückgeben werden die auch nicht gefreet?
Verfasst: 29.01.2006 22:02
von NicTheQuick
Du kannst doch gar keine Strings von einer DLL-Funktion zurückgeben
lassen. Du kannst höchstens einer Funktion einen Buffer übergeben, den
sie dann füllt.
Verfasst: 29.01.2006 22:04
von remi_meier
Was meinst du, wieso du Rückgabestrings immer als Global definieren musst?