> An interesting case is when using C's malloc for C1 and using the scope > attribute for c1: > > class C1 { > ubyte[1_000_000] buf; > new(size_t size) { > void* ptr = std.c.stdlib.malloc(size); > if (ptr is null) > throw new OutOfMemoryError(__FILE__, __LINE__); > writefln("C1.new(%d) = %x", size, ptr); > return ptr; > } > delete(void* ptr) { > writefln("C1.delete %x", ptr); > if (ptr) std.c.stdlib.free(ptr); > } > this() { writeln("C1()"); } > ~this() { writeln("~C1()"); } > } > ... > scope C1 c1 = new C1; > > In this case, ~C1 gets invoked but not C1.delete. Nevertheless, the > memory appears to get freed (normal memory consumption, no OutOfMemory). > How does this happen?
Ok, I figured that out myself: c1 is allocated on the stack in this case, so no neither the allocator nor the deallocator need to get called.