Speicherleck bei Nutzung von Strukturen(mitStrings)im Memory
Verfasst: 23.01.2006 14:29
Hallo.
Auf das Problem bin ich gestoßen im Beitrag
http://forums.purebasic.com/german/view ... 3593#73593
Ich wollte muß Strukturen (auch mitPointer) in den Memory schreiben und NicTheQuick hat mir da echt geholfen. Ich bin da aber auf ein Problem gestoßen. Löscht man diese bleibt anscheinend zwangsweise der Inhalt des Pointerziels (ein Sting aus der Struktur) im Speicher zurück.
Vermutlich ist das Freigeben von Speicher einer Struktur nicht angedacht bzw. bei überschreiben der selben Struktur (im exakt selben speicherbereich) wird der alte gelöscht (hoffe ich mal).
wie kann man das aber machenn, wenn man den strukturpointer ständig wechselt um im Memory zu schreiben.
Beispielcode und meinen Text findet ihr unter dem Link oben oder hier nochmal:
Auf das Problem bin ich gestoßen im Beitrag
http://forums.purebasic.com/german/view ... 3593#73593
Ich wollte muß Strukturen (auch mitPointer) in den Memory schreiben und NicTheQuick hat mir da echt geholfen. Ich bin da aber auf ein Problem gestoßen. Löscht man diese bleibt anscheinend zwangsweise der Inhalt des Pointerziels (ein Sting aus der Struktur) im Speicher zurück.
Vermutlich ist das Freigeben von Speicher einer Struktur nicht angedacht bzw. bei überschreiben der selben Struktur (im exakt selben speicherbereich) wird der alte gelöscht (hoffe ich mal).
wie kann man das aber machenn, wenn man den strukturpointer ständig wechselt um im Memory zu schreiben.
Beispielcode und meinen Text findet ihr unter dem Link oben oder hier nochmal:
Das soll kein Crossposting sein, aber da es eigendlich in den alten Beitrag gehört, aber ein neues Problem ist öffne ich diesen Beitrag neu. Sonst lies es logischer weise kaum jemand.Mir ist da nochwas aufgefallen,leider wie alles nur im Kopf, da der Code noch nicht ausführbar ist den ich nutze.
Wenn ich nun per stuktur einen speicherplatz (mit ...memory) erstelle, dort dann elemente reinschreibe, so wie ihn deinem code oben, dann können ja auch pointer vorkommen. das ist ansich kein problem.
auch muß ich ja nicht den inhalt kopieren, weil ich die copymemory funktion nur benutze um die daten temporär auszulagen damit ich den "originalspeicher" in der größe ändern kann.
aber in diesem fall des hin und her kopierens, wie auch in "deinem einfachen fall" mit "freememory" wird "mindestens der ram" der allociert wurde freigegeben.
wie aber verhält es sich mit pointern? woher weiß pb wo und wann ein pointer gelöscht wird oder nicht.
wird also wenn ich die daten (pointer) kopiert habe und das original lösche dort auch der inhalt des zieles der pointer gelöscht oder nur der pointer?
ich befürchte, das der inhalt nicht gelöscht wird. das wäre zwar einerzeit gar nicht mal schlecht (sonst wäre ja wohl auch die kopie weg, da der pointer auf die selbe stelle zeigt), aber sobald ich reallocate oder freememory nutze würden die inhalte die durch pointer markiert sind im speicher bleiben und ich hätte ein leck.
weißt du wie das genau aussieht und wie könnte ich das umgehen?
wie kann man also z.b. in bei deinem bespiel die strings komplett aus dem speicher bekommen damit kein leck entsteht. (falls da eines entstehen würde).
mir depp fällt das leider erst jetzt auf, wo ich die komplette ramdatenverarbeitung schon im grunde fertig habe. shit.
[edit]
Code:
OpenConsole()
Structure TestStruc
l.l
s.s
f.f
EndStructure
;*pElement.TestStruc = *pArray ;Pointer zum Speichern dem ersten Element bergeben
For i = 1 To 100000
Elemente.l = 10 ;Anzahl der Element
*pArray = AllocateMemory(SizeOf(TestStruc) * Elemente) ;Speicher resevieren fr alle Elemente
*pElement.TestStruc = *pArray ;Pointer zum Speichern dem ersten Element bergeben
;Print(Str(i))
For a.l = 1 To Elemente ;Elemente fllen
*pElement\l = Elemente + 1 - a
*pElement\s = "Zahl: " + Str(a) + "-------------------------------------------------------------"
*pElement\f = 1 / a
*pElement + SizeOf(TestStruc)
Next
*pElement = *pArray ;Erstes Element wieder auswhlen
For a.l = 1 To Elemente ;Elemente auslesen
;Debug Str(a) + ". Element:"
;Debug *pElement\l
;Debug *pElement\s
;Debug *pElement\f
;Debug ""
;*pElement + SizeOf(TestStruc)
Next
FreeMemory(*pArray) ;Array wieder freigeben
Next i
For i = 1 To 100
Delay(100)
Next i
CloseConsole()
Der Code hier bringt wirklich ein "Speicherleck". Er sollte ja wenn möglich den Speicher nach jeden Durchlauf freigeben, aber es bleibt etwas übrig und so sind bei dem durchlauf hier ca. 40 MB Ram weg.
Bin für Tips dankbar.
Danke
Thorsten