Speicher

D ist eine Systemprogrammiersprache und erlaubt daher manuellen Zugriff auf den Systemspeicher. Manueller Zugriff impliziert jedoch, dass Fehler sehr leicht entstehen können, daher verwendet D standardmäßig einen Garbage Collector um Speicher freizugeben.

D verfügt über Adresstypen (aka Pointer) T* wie in C:

int a;
int* b = &a; // b beinhaltet die Adresse zu a
auto c = &a; // c hat den Typp int* und beinhaltet die Adresse zu a

Mit dem new Ausdruck kann ein neuer Speicherblock auf dem Heap alloziert werden. Der new Ausdruck gibt einen Pointer zu den allozierten Speicher zurück:

int* a = new int;

Sobald der Speicher, welcher durch a adressiert wird, von keiner Variable des Programmes mehr referenziert wird, wird der Speicher durch den Garbage Collector freigegeben.

In D gibt es drei Sicherheitsstufen für Funktionen: @system, @trusted und @safe. Außer explizit angeben, werden Funktionen als @system behandelt. @safe ist ein Subset von D, welches per Definition Speicherfehler verhindert. @safe Code kann nur andere @safe Funktionen oder Funktionen denen explizit mit @trusted vertraut wird, aufrufen. Manuelle Adressarithmetik ist in @safe Code verboten.

void main() @safe {
    int a = 5;
    int* p = &a;
    int* c = p + 5; // Fehler
}

@trusted Funktionen müssen manuell verifiziert werden und erlauben die Brücke zwischen SafeD und der zugrundeliegenden unsicheren, low-level Welt.

In der Tiefe

rdmd playground.d