Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

automatische Speicherfreigabe

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 06.12.2009, 22:42    Titel: automatische Speicherfreigabe Antworten mit Zitat

Hallo Forum,

mal eine Grundlagenfrage, weiß jemand ob der reservierte Speicher so ala

Code:

   test = allocate (sizeof(datentype) * matrix_y * matrix_x)


in Objekten, Prozeduren ect. nach Beendigung des gesamten Programmes automatisch wieder freigegeben wird ?

Oder sollte man lieber am Ende den vorher reservierten Speicher sicherheitshalber selbst wieder frei geben ?

Danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 07.12.2009, 00:16    Titel: Antworten mit Zitat

Wird er nicht.

Code:

Type MemDesc
   Ptr As Any Ptr
   Size As UInteger
End Type

Declare Function GetMemList () As MemDesc Ptr

Dim Shared As UInteger memalloc
Dim Shared As MemDesc memblocks(0 To 2^24)
Dim Shared As UInteger memblocksi

Function Allocate (count As UInteger) As Any Ptr
   Dim As MemDesc md
   md.Ptr = malloc(count)
   md.Size = count
   
   memblocks(memblocksi).Ptr = md.Ptr
   memblocks(memblocksi).Size = md.Size
   
   memalloc += md.Size
   memblocksi += 1
   
   Return md.Ptr
End Function

Function DeAllocate (mem As Any Ptr) As Integer
   For n As UInteger = 0 To memblocksi
      If memblocks(n).Ptr = mem Then
         free(memblocks(n).Ptr)
         
         memblocks(n).Ptr = 0
         memblocks(n).Size = 0
         memalloc -= memblocks(n).Size
         memblocksi -= 1
         
         Return TRUE
      EndIf
   Next
   
   Return FALSE
End Function

Function CollectGarbarage () As Integer
   For n As UInteger = 0 To memblocksi
      free(memblocks(n).Ptr)
      
      memblocks(n).Ptr = 0
      memblocks(n).Size = 0
      memalloc -= memblocks(n).Size
      memblocksi -= 1
      
      Return TRUE
   Next
End Function

Function GetAllocMem () As UInteger
   Return memalloc
End Function

Musst nur noch ein paar Deklarationen und zwei #Undefs hinzufügen, schon sollte es laufen...
Der MM ist aber eher suboptimal (Array fester Größe mit ziemlichen Speicherverbrauch...)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.12.2009, 00:46    Titel: Antworten mit Zitat

Zitat:

DIM SHARED AS MemDesc memblocks(0 TO 2^24)

nice, erstmal bis zu 128mb speicher mit ner schönen liste belegen, wenn man denn so viele handles braucht ...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 07.12.2009, 16:01    Titel: Antworten mit Zitat

Darauf habe ich ja hingewiesen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.12.2009, 16:51    Titel: Antworten mit Zitat

Es ist aber nicht unbedingt fest. Zumindest nicht so, wie FB es scheinbar verwaltet (wenn man es nicht füllt, braucht das FB-Programm nur 500kb).
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 07.12.2009, 16:57    Titel: Antworten mit Zitat

Keiner hat gesagt, dass der Compiler gar nicht optimiert. grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 08.12.2009, 03:01    Titel: Antworten mit Zitat

Ist allein deswegen schon eine interessante Frage weil ich ja sonst den Speicherbereich überlaufen könnte ...

Könnte ja jemand auf die Idee kommen api's zu überladen und bestimmten Systemcode mit korrumpierten Speicherbereichen zu überschreiben. (aber das ist ein anderes thema)

Eigentlich sollte ja Windows nach Beendigung eines speraten Programmthreades jeglichen Speicherbereiche wieder freigeben, so meine Logik.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 08.12.2009, 08:20    Titel: Antworten mit Zitat

egal was du überlädst, irgendwo wird immer noch eine systemfunktion dahinter stecken, selbst wenn du jetzt all deine allocates plötzlich mit strings realisieren würdest.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 08.12.2009, 18:47    Titel: Antworten mit Zitat

Muss es aber nicht.
Es hat einen Grund warum es free gibt. Und es wird auch ganz klar gesagt, dass DU das machen musst. Java macht es automatisch (GC), Windows ist nicht dazu verpflichted. "This behaviour could be altered in subsequent versions of Windows" (Oder so ähnlich)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz