D LanguageMemory & Pointers

Syntax

  • &<variable> - access by reference (=gets the pointer to the data of the variable)
  • *<variable> - deference operator (=gets the data object from a pointer)
  • <type>* - data type that points to <type> (e.g. `int*)

Pointers

D is a system programming language and thus allows you to manually manage and mess up your memory. Nevertheless, D uses a garbage collector per default to free unused memory.

D provides pointer types T* like in C:

void main()
{
    int a;
    int* b = &a; // b contains address of a
    auto c = &a; // c is int* and contains address of a

    import std.stdio : writeln;
    writeln("a ", a);
    writeln("b ", b);
    writeln("c ", c);
}

Allocating on the heap

A new memory block on the heap is allocated using the new expression, which returns a pointer to the managed memory:

void main()
{
    int* a = new int;
    *a = 42; // dereferencing
    import std.stdio : writeln;
    writeln("a: ", *a);
}

@safe D

As soon as the memory referenced by a isn't referenced anymore through any variable in the program, the garbage collector will free its memory.

D also allows pointer arithmetic, except in code that is marked as @safe.

void safeFun() @safe
{
    writeln("Hello World");
    // allocating memory with the GC is safe too
    int* p = new int;
}

void unsafeFun()
{
    int* p = new int;
    int* fiddling = p + 5;
}

void main()
{
    safeFun();
    unsafeFun();
}

For more information about SafeD see the article from the D design team.