![Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht](misc/logos/logo.png) |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
cromfelge
Anmeldungsdatum: 28.02.2023 Beiträge: 5
|
Verfasst am: 28.02.2023, 11:50 Titel: Brauchen in SUBs dimensionierte Variablen später Speicher? |
|
|
Hallo!
Ich dachte bisher immer, dass per DIM dimensionierte Variablen und Arrays nach dem Ende eines SUB automatisch geleert und gelöscht werden und keinen zusätzlichen Speicher benötigen.
Um das zu "beweisen", habe ich dieses kleine Programm geschrieben, das mir aber leider unerwartete Ergebnisse lieferte:
Code: | WIDTH 80, 25
SUB STRINGS
DIM AS STRING coolString(1 TO 10000)
FOR i AS DOUBLE = 1 TO 10000
coolString(i) = "This array is big!"
NEXT
PRINT "Voll"
SLEEP
END SUB
PRINT "Leer"
SLEEP
STRINGS
PRINT "Leer"
SLEEP
|
Jetzt belegt das Programm laut Task-Manager vor der Durchführung des SUB ca. 2,0 MB Arbeitsspeicher. Während das SUB läuft, steigt der Speicherbedarf erwartbar auf 2,7 MB. Nachdem das SUB aber beendet ist, sinkt der benötigte Arbeitsspeicher jedoch nur auf 2,2 MB ab.
Ist das einfach so und man muss anders programmieren? Gibt es irgendeinen Code/Befehl, der das verhindert und wirklich alles am Ende des SUB löscht? Oder liegt der Fehler beim Task-Manager?
Bei großen Programmen mit vielen SUBs kann sich das ja sonst schon zu einem gewissen Speicherbedarf aufaddieren...
Vielen Dank schon mal für eure Ideen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 28.02.2023, 15:19 Titel: |
|
|
Das hängt mit der internen Speicherverwaltung von FB zusammen. Da Prozedurcn (also SUBs bzw. FUNCTIONs) üblicherweise mehrfach aufgerunfen werden, bleibt der beim ersten Aufruf reservierte Speicher (zumindest in gewissen Grenzen) während der Programmlaufzeit im Besitz der Prozedur, damit er nicht bei jedem Aufruf neu reserviert werden muß.
Du brauchst also (zumindest in diesem Fall) keine Angst vor einem Speicherleck zu haben.
Code: | Width 80, 25
Sub STRINGS
Dim As String coolString(1 To 10000)
For i As Integer = 1 To 10000
coolString(i) = "This array is big!"
Next
? @STRINGS, @coolstring(1) 'pointer auf die sub und auf das erste Element des arrays
End Sub
Print "Leer"
Sleep
STRINGS
Print "1"
Sleep
STRINGS
Print "2"
Sleep
STRINGS
Print "3"
Sleep
STRINGS
Print "4"
Sleep
Print "working..."
For x As Integer = 1 To 1000
STRINGS
Next
Print "OK"
Sleep |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
cromfelge
Anmeldungsdatum: 28.02.2023 Beiträge: 5
|
Verfasst am: 28.02.2023, 17:17 Titel: |
|
|
Vielen Dank für das Beispiel in der Antwort, das macht es gut deutlich. So ist das ja schon einmal beruhigend. Eigentlich arbeiten ja auch alle Programme so, von denen ich den Code gelesen habe, aber das Ergebnis meines Testprogramms hatte mich dann schon etwas verwundert. Im Vergleich zu dem, was Browser und moderne Spiele so ziehen, komme ich bei FB eh selten ans Limit ![lachen](images/smiles/icon_lol.gif) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|