Referenz - ALLOCATE
Syntax: ALLOCATE (Bytes)
Typ: Funktion
Kategorie: Speicher
ALLOCATE reserviert ("alloziert") eine beliebige Anzahl von Bytes im Speicher (Heap) und liefert einen Pointer zum Anfang dieses Speicherbereichs.
- 'Bytes' ist ein INTEGER-Wert, der angibt, wie viele Bytes reserviert werden sollen.
- Der Rückgabewert ist ein Pointer auf den Anfang des Speicherbereichs. Wenn beim Allozieren ein Fehler auftritt, ist der Rückgabewert 0 (Null-Pointer).
- Die reservierten Bytes werden nicht auf 0 gesetzt, dazu siehe CALLOCATE
Ein mit ALLOCATE reservierter Speicherbereich muss mit DEALLOCATE wieder freigegeben werden.
ALLOCATE ist kein Teil der FreeBASIC Runtime Library, sondern ein Alias von 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 DEALLOCATE-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 REALLOCATE verwenden oder zumindest den alten Speicherbereich mit DEALLOCATE freigeben.
Hinweis:
ALLOCATE überschreibt im Gegensatz zu CALLOCATE nicht den bisherigen Inhalt des reservierten Speichers, weswegen zufällige Werte enthalten sein können. In Verbindung mit Strings 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 -lang qb steht ALLOCATE nicht zur Verfügung und kann nur über __ALLOCATE aufgerufen werden.
Siehe auch:
CALLOCATE, REALLOCATE, DEALLOCATE, Pointer, Speicher
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|