D является системным языком программирования и позволяет вручную управлять памятью. Однако такое управление памятью довольно опасно и может приводить к ошибкам. Поэтому по умолчанию в D управлением выделения памяти занимается сборщик мусора.
D предоставляет тип указателя T*, как в языке C:
int a;
int* b = &a; // b содержит адрес переменной a
auto c = &a; // c является int* и содержит адрес переменной a
Новый блок памяти на куче выделяется с помощью выражения new, которое
возвращает указатель на управляемую сборщиком мусора память:
int* a = new int;
Как только на память, на которую сейчас ссылается a, не будет больше ссылаться ни
одна переменная в программе, сборщик мусора освободит её.
В D есть три различных уровня защиты для функций: @system, @trusted и @safe.
Если не указано иное, по умолчанию используется @system.
@safe это подмножество языка D, которое может быть использовано для предотвращения ошибок, связанных с доступом к памяти. Код, отмеченный как @safe, может вызывать только другие @safe или @trusted функции. Явные арифметические операции с указателями запрещены в коде, отмеченном как @safe:
void main() @safe {
int a = 5;
int* p = &a;
int* c = p + 5; // ошибка
}
Функции @trusted - это вручную проверенные функции, позволяющие
связать мир SafeD и небезопасную низкоуровневую функциональность.