Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - ALLOCATE

Referenz-Navigation

 

Syntax: ALLOCATE (Bytes)
Typ: Funktion
Kategorie: Speicher

ALLOCATE reserviert ("alloziert") eine beliebige Anzahl von Bytes im Speicher (Heap) und liefert einen BefehlsreferenzeintragPointer zum Anfang dieses Speicherbereichs.

Ein mit ALLOCATE reservierter Speicherbereich muss mit BefehlsreferenzeintragDEALLOCATE wieder freigegeben werden.

ALLOCATE ist kein Teil der FreeBASIC Runtime Library, sondern ein Alias von Externer Link!malloc der C-Lib.
Achtung: Es kann nicht garantiert werden, dass diese Funktion auf allen Plattformen Multithreading unterstützt, d.h. thread-safe ist. Unter Windows und Linux sind aktuell durch die verwendeten Implementationen der Betriebssysteme aber keine Probleme zu erwarten.

Beispiel:
Mit ALLOCATE wird ein dynamisches Array erstellt, dessen Elemente mit einer Fibonacci-Sequenz befüllt werden. Beachten Sie den BefehlsreferenzeintragDEALLOCATE-Aufruf am Programmende, der den Speicher wieder freigibt.

' Platz für 15 INTEGER-Speicherstellen reservieren
CONST IntegerCount AS INTEGER = 15
DIM AS INTEGER PTR buffer
buffer = ALLOCATE( IntegerCount * SIZEOF( INTEGER ) )

IF( buffer = 0 ) THEN
   ' Reservierung schlug fehl wenn PTR = 0
   PRINT "Fehler: Speicher konnte nicht reserviert werden"
   END -1
END IF

' Fibonacci-Sequenz einleiten
buffer[ 0 ] = 0
buffer[ 1 ] = 1

DIM AS INTEGER i
' ..., vervollständigen...
FOR i = 2 TO IntegerCount - 1
   buffer[ i ] = buffer[ i - 1 ] + buffer[ i - 2 ]
NEXT
' ... und ausgeben
FOR i = 0 TO IntegerCount - 1
   PRINT buffer[ i ] ;
NEXT

' Speicher wieder freigeben
DEALLOCATE( buffer )

' auf Tastendruck warten und beenden
SLEEP
END 0

Ausgabe:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Achtung: Wenn Sie einen Speicherbereich reservieren, MÜSSEN Sie diesen nach Gebrauch wieder freigeben, da er sonst reserviert bleibt. Sehen Sie sich dieses Beispiel an:

SUB AllocateExample2()
   DIM AS INTEGER PTR IntegerPtr = 0

   ' erste Reservierung
   ' Pointer auf neuen Speicherbereich setzen
   IntegerPtr = ALLOCATE( SIZEOF( INTEGER ) )

   ' zweite Reservierung
   ' Pointer auf neuen Bereich verlegen
   IntegerPtr = ALLOCATE( SIZEOF( INTEGER ) )
   DEALLOCATE( IntegerPtr )
END SUB

AllocateExample2()
SLEEP : END 0

In diesem Beispiel geht bei jedem Funktionsaufruf Speicherplatz verloren, da der von der ersten Reservierung bereitgestellte Speicherbereich nicht mehr dealloziert wird. Daher sollten Sie, wenn Sie einen größeren Speicherbereich benötigen, die Funktion BefehlsreferenzeintragREALLOCATE verwenden oder zumindest den alten Speicherbereich mit BefehlsreferenzeintragDEALLOCATE freigeben.

Hinweis:
ALLOCATE überschreibt im Gegensatz zu BefehlsreferenzeintragCALLOCATE nicht den bisherigen Inhalt des reservierten Speichers, weswegen zufällige Werte enthalten sein können. In Verbindung mit BefehlsreferenzeintragStrings sollte aufgrund der internen Verarbeitung unbedingt mit CALLOCATE reserviert werden.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Es kann nicht garantiert werden, dass die Prozedur auf allen Plattformen thread-safe ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform Befehlsreferenzeintrag-lang qb steht ALLOCATE nicht zur Verfügung und kann nur über __ALLOCATE aufgerufen werden.

Siehe auch:
BefehlsreferenzeintragCALLOCATE, BefehlsreferenzeintragREALLOCATE, BefehlsreferenzeintragDEALLOCATE, BefehlsreferenzeintragPointer, BefehlsreferenzeintragSpeicher


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 25.06.2007 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 05.04.2014 von RedakteurMOD gespeichert.
  Versionen Versionen