I'm trying to implement a very minimal D runtime for the ARM Cortex-M platform. I've been quite successful so far, but I'm now getting into reference types and I need to understand better what D does under the hood.

I have a working malloc/free implementation, but don't have a garbage collector. I'm not yet sure if I want a garbage collector, so at the moment, I'm trying to implement something simple.

Consider the following code modeled after the example at http://dlang.org/memory.html#newdelete:

*************************************
class X
{
    __gshared uint _x;

    new(size_t nBytes)
    {
        Trace.WriteLine("Constructing");
        
        void* p;

        p = malloc(nBytes);

        if (p == null)
        {
            //TODO:
            //throw new OutOfMemoryError();
        }

        return p;
    }

    ~this()
    {
        Trace.WriteLine("Destructor");
    }

    delete(void* p)
    {
        if (p != null)
        {
            free(p);
        }

        Trace.WriteLine("Destroying");
    }
}

void DoX()
{
    X x = new X();
    x._x = 123;
    Trace.WriteLine(x._x);

    //Why doesn't x's destructor get called here.
}

//My entry point
void main()
{
    DoX();

    Trace.WriteLine("Done");
    while(true) { }
}
**************************************

The output is as follows:
------------------------------
Constructing
56
Done

x's destructor never gets called. What do I need to implement to have the destructor called when x goes out of scope?

I'm using GDC 4.8 cross-compiled for arm-none-eabi on a Linux 64-bit host.

Thanks,
Mike

Reply via email to