NEW

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » N » NEW

Syntax A: Rueckgabe = NEW [(Adresse)] Datentyp (Parameterliste)
Syntax B: Rueckgabe = NEW [(Adresse)] Datentyp [Anzahl]
Typ: Operator
Kategorie: Speicherverwaltung

NEW weist dynamisch Speicher zu und erzeugt Daten/Objekte des angegebenen Typs.

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-Constructor 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 jedoch mit DELETE [ ], der Array-Version von DELETE. Die verschiedenen Versionen der Operatoren dürfen nicht vermischt werden und 'passen' auch nicht zueinander.

Wird NEW mit dem Adressen-Parameter 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 Destructor des Objekts explizit aufgerufen und der Speicher hinterher mit der zur Reservierung entsprechenden Freigabemethode freigegeben werden.

Wird der Anfangswert 'ANY' benutzt, wie z.B. in NEW Datentyp (ANY) oder NEW Datentyp [Anzahl] {ANY}, wird zwar Speicher für 'Datentyp' reserviert, aber die Daten werden nicht initialisiert. Das gilt nur bei Datentypen, die keine Konstruktoren besitzen.

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 die selbe Adresse im Speicher
Print ap, r
Print r->zaehler & "/" & r->nenner

'Statt mit DELETE sollte das Objekt durch explizites
'aufrufen des Destructors 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