D 언어는 시스템 소프트웨어를 만드는데 쓰일 수 있는 프로그래밍 언어로써, 프로그램의 메모리를 프로그래머가 직접 관리할 수 있는 방법을 제공합니다.
그러나 직접 관리하게 될 경우 할당 후 미해제, 해제된 메모리 사용 등의 문제가 발생하기 쉽습니다. 따라서 프로그래머가 명시적으로 선언하지 않는 한 기본적으로는 가비지 컬렉터(Garbage collector) 의 도움을 받습니다.
D 언어는 C 언어처럼 포인터 타입 T*
를 지원합니다.
int a;
int* b = &a; // b에는 a의 메모리 주소가 저장됩니다.
auto c = &a; // c에는 등호(=) 우측을 봤을 int 타입의 변수 a에 대한 주소가 있으므로 auto는 int*로 유추됩니다.
힙(heap) 메모리 구역에 메모리를 할당 받는 것은 new
라는 구문을 통해 가능합니다. new
로 할당받은 메모리는 D 언어의 가비지 컬렉터가 관리할 수 있는 메모리 공간입니다.
int* a = new int;
가비지 컬렉터가 관리하는 메모리는, 프로그램 전체적으로 전혀 사용되지 않을 때 자동으로 해제됩니다.
함수의 메모리 보호 모드는 @system
, @trusted
, and @safe
세가지 어노테이션(Annotation)으로 조절할 수 있습니다. 특별히 명시하지 않으면 기본은 @system
으로 지정됩니다.
@safe
는 일부 기능이 제한된 D 언어 모드를 제공하는데, 언어 설계부터 메모리 관련 버그를 예방할 수 있도록 설계되어있는 모드입니다. @safe
로 표시된 함수는 다른 함수를 호출할 때에 자신과 같은 수준인 @safe
또는 프로그래머가 지정한 수준인 @trusted
만 호출할 수 있습니다. 게다가, 이 모드에서는 메모리 포인터 연산을 금지하고 있습니다.
void main() @safe {
int a = 5;
int* p = &a;
int* c = p + 5; // @safe 에서는 포인터 연산이 금지되어있습니다. 오류가 발생합니다.
}
@trusted
는 직접 메모리 접근 등의 위험한 기능을 하는 저수준(low-level) 함수와 SafeD 코드 간을 이어주는 중계 함수가 있을 때, @safe
에서 호출할 수 있다고 표시할 때 사용됩니다. @trusted
는 프로그래머가 직접 코드를 검토하고 안전하다고 결론을 내려졌을 때 해당 함수에 표기하면 됩니다.