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.