Can't I allocate at descontructor?
tsbockman
thomas.bockman at gmail.com
Fri Mar 5 21:17:24 UTC 2021
On Friday, 5 March 2021 at 21:02:08 UTC, H. S. Teoh wrote:
> If you know when you can deallocate something, that means you
> don't need the GC to collect it, so you could just allocate it
> on the malloc heap instead, and call destroy/free once you're
> done. You could use the C version of malloc/free. You can
> also optionally use GC.malloc/GC.free.
>
> E.g.:
>
> class C {...}
>
> import core.memory : GC;
> C c = cast(C) GC.malloc(C.sizeof);
> ... // use c
>
> // We're done with c, destroy it
> destroy(c); // this will call the dtor
> GC.free(cast(void*) c);
> c = null; // optional, just to ensure we don't accidentally
> use it again
Unless the function is nothrow, that should really be:
import core.memory : GC;
C c = cast(C) GC.malloc(C.sizeof);
scope(exit) {
// We're done with c, destroy it
destroy(c); // this will call the dtor
GC.free(cast(void*) c);
c = null; // optional, just to ensure we don't
accidentally use it again
}
... // use c
Or,
import core.memory : GC;
C c = cast(C) GC.malloc(C.sizeof);
try {
... // use c
} finally {
// We're done with c, destroy it
destroy(c); // this will call the dtor
GC.free(cast(void*) c);
c = null; // optional, just to ensure we don't
accidentally use it again
}
More information about the Digitalmars-d-learn
mailing list