Reference counting questions

Johannes Pfau spam at example.com
Mon Jul 25 02:32:44 PDT 2011


Andrej Mitrovic wrote:
>I'm don't understand why this code calls the dtor before it calls the
>ctor:
>
>import std.stdio;
>import std.typecons;
>
>void main()
>{
>    auto wrap1 = Wrapper(1);
>}
>
>void free(ref int _payload)
>{
>    writeln("dealloc");
>    _payload = 0;
>}
>
>struct Wrapper
>{
>    struct Payload
>    {
>        int _payload;
>        this(int h) { writeln("alloc"); _payload = h; }
>        ~this() { free(_payload); }
>
>        this(this) { assert(false); }
>        void opAssign(Wrapper.Payload rhs) { assert(false); }
>    }
>
>    private alias RefCounted!(Payload, RefCountedAutoInitialize.no)
> Data; private Data _data;
>
>    this(int h) { _data = Data(h); }
>}
>
>prints:
>dealloc
>alloc
>dealloc
>
>What's with the first dtor call?

Strange, I can confirm this behavior and it seems to happen all the
time when using RefCounted.

I guess this was never an issue for the RefCounted code in phobos (for
example std.container.Array) as RefCounted was only used to manage
memory, not handles from C libraries. free simply does nothing if
called with a null pointer, so this problem never showed up.

As a workaround, check your handle against null in the destructor
before calling the function to close the handle.

-- 
Johannes Pfau



More information about the Digitalmars-d-learn mailing list