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 и небезопасную низкоуровневую функциональность.