Referenz - NEW
Syntax A: NEW [(Adresse)] Datentyp [(Parameterliste | ANY)]
Syntax B: NEW [(Adresse)] Datentyp [Anzahl] [{ ANY }]
Typ: Operator
Kategorie: Operatoren
NEW weist dynamisch Speicher zu und erzeugt Daten/Objekte des angegebenen Typs.
- 'Parameterliste' gibt den/die Anfangswert(e) der Variablen an. Sie kann auch ausgelassen werden.
- 'Datentyp' ist der Name des zu erzeugenden Datentyps. Es kann sich um einen Standarddatentyp oder ein UDT handeln. Auch Pointer sind möglich. STRINGs sind allerdings nicht erlaubt.
- 'Anzahl' gibt die Anzahl der zu erzeugenden Elemente an.
- 'Adresse' ist ein bereits alloziierter Pointer, an den das Objekt geschrieben werden soll.
- Wird der Anfangswert 'ANY' benutzt, wie z. B. in NEW Datentyp (ANY) oder NEW Datentyp [Anzahl] {ANY}, wird zwar Speicher für 'Datentyp' reserviert, die Daten werden jedoch nicht initialisiert. Das gilt nur bei Datentypen, die keine Konstruktoren besitzen.
- Der Rückgabewert ist ein Pointer des Typs 'Datentyp' auf den neu erzeugten Datenbereich.
NEW weist dynamisch Speicher zu und konstruiert den angegebenen Datentyp. Bei einfachen Typen wie INTEGERs kann ein Anfangswert angegeben werden. Bei Typen ohne Konstruktoren können Anfangswerte für jedes Feld angegeben werden. Bei Typen, die Konstruktoren besitzen, können diese durch NEW auch aufgerufen werden. Wird 'Parameterliste' nicht angegeben, werden die Standardwerte für diese Typen benutzt.
NEW ['Anzahl'] ist die Array-Version von NEW und weist genügend Speicher für die angegebene Anzahl der Objekte zu. Der Standard-Konstruktor des Typs wird dann aufgerufen, um die Anfangswerte jedes Objekts zu setzen.
Objekte, die mit NEW erzeugt wurden, müssen mit DELETE freigegeben werden. Speicher, der mittels NEW [Anzahl] reserviert wurde, muss jedoch mit DELETE [ ], der Array-Version von DELETE, freigegeben werden. Die verschiedenen Versionen der Operatoren dürfen nicht vermischt werden und 'passen' auch nicht zueinander.
Wird NEW mit dem Parameter 'Adresse' verwendet, so reserviert NEW keinen Speicher, sondern erzeugt das Objekt an der vorgegebenen Adresse. Der Speicher muss also schon vorher reserviert werden. Da der Speicher nicht durch NEW reserviert wird, sollte er auch nicht mit DELETE freigegeben werden. Stattdessen sollte der Destruktor des Objekts explizit aufgerufen und der Speicher hinterher mit der zur Reservierung entsprechenden Freigabemethode freigegeben werden.
NEW kann mithilfe von OPERATOR überladen werden.
Beispiel 1:
Type Rational
As Integer Zaehler, Nenner
End Type
Scope
' Erzeugen und Initialisieren eines Rationalbruchs
' und Speichern seiner Adresse
Dim p As Rational Ptr = New Rational(3, 4)
Print p->Zaehler & "/" & p->Nenner
' Löschen des Bruchs und Rückgabe des Speichers
' an das System
Delete p
End Scope
Scope
' Speicherreservierung für 100 Integers, Speichern
' der Adresse des ersten
Dim p As Integer Ptr = New Integer[100]
' Zuweisen von Werten an die Integers im Array
For i As Integer = 0 To 99
p[i] = i
Next
' Freigeben des gesamten Integer-Arrays
Delete[] p
End Scope
Sleep
Beispiel 2:
Type Rational
As Integer zaehler, nenner
End Type
' Pointer anlegen und Größe des Types reservieren
Dim As Any Ptr ap = Callocate(SizeOf(Rational))
' Pointer des Types anlegen und neues Objekt an die Stelle
' des bereits reservierten Speichers schreiben
Dim As Rational Ptr r = New (ap) Rational( 3, 4 )
' Beide Pointer haben nun dieselbe Adresse im Speicher
Print ap, r
Print r->zaehler & "/" & r->nenner
' Statt mit DELETE sollte das Objekt durch explizites
' Aufrufen des Destruktors zerstört werden, da DELETE
' den Speicher danach freigibt, was zu Speicherproblemen
' und Programmabstürzen führen kann
r->Destructor( )
' Den Speicher letztlich freigeben
DeAllocate ap
' Auf Tastendruck vor Programmende warten
Sleep
Unterschiede zu QB: neu in FreeBASIC
Unterschiede unter den FB-Dialektformen: nur in der Dialektform -lang fb verfügbar
Siehe auch:
DELETE, Speicher
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|