static string[] log; static class Par { this( uint i ) { log ~= "+par"; } ~this() { log ~= "-par"; } } static class Ch : Par { this() { super(1); log ~= "+ch"; } ~this() { log ~= "-ch"; } } assert( log.length == 0 ); auto inc = 0; { RCObject!Ch c; { auto a = rcMake!Ch(); assert( equal( log, ["+par","+ch"] ) ); assert( a.refCount == 1 ); auto b = a; assert( equal( log, ["+par","+ch"] ) ); assert( a.refCount == 2 ); assert( b.refCount == 2 ); c = a; assert( a.refCount == 3 ); assert( b.refCount == 3 ); assert( c.refCount == 3 ); b = rcMake!Ch(); assert( a.refCount == 2 ); assert( b.refCount == 1 ); assert( c.refCount == 2 ); assert( equal( log, ["+par","+ch","+par","+ch"] ) ); b = rcMake!Ch(); assert( a.refCount == 2 ); assert( b.refCount == 1 ); assert( c.refCount == 2 ); assert( equal( log, ["+par","+ch","+par","+ch", "+par","+ch", // new Ch stored in b "-ch","-par" // old Ch in b ] ) ); } assert( c.refCount == 1 ); } assert( equal( log, ["+par","+ch","+par","+ch", "+par","+ch","-ch","-par", "-ch","-par","-ch","-par"] ) );