How to use destroy and free.
Dukc
ajieskola at gmail.com
Sat Apr 30 09:25:18 UTC 2022
On Sunday, 24 April 2022 at 21:00:50 UTC, Alain De Vod wrote:
> Is this a correct program to explicit call destroy & free ?
>
> ```
> void main(){
> int[] i=new int[10000];
> import object: destroy;
> destroy(i);
> import core.memory: GC;
> GC.free(GC.addrOf(cast(void *)(i.ptr)));
> }
> ```
A few picks.
1: You do not need to import `destroy`. Everything in `object` is
automatically imported.
2: As others have said, destroying an int, or an array if them,
is meaningless, since they do not have destructors. The only
thing your call does is to set `i` to `null`. In this case it
means that there are no more references to the array, so the
garbage collector can collect it at some point.
3: Because `i` is now null, `GC.free` also does nothing. If you
had something that really mandated using `destroy`, you'd want to
use `destroy!false(i)` to avoid setting `i` to `null`.
4: Manually freeing garbage collected memory is just as dangerous
as freeing manually managed memory. It's preferable to just let
the GC collect the memory. Also like said, there's probably no
point to allocate with GC in the first place if you're going to
manually free the memory.
5: If you're in a hurry to free the memory, a safer way is to
call `GC.collect`. It will most likely free your old data
immediately. Don't trust it quite 100% though, since it's
possible that some unlucky bit pattern in your remaining data,
that isn't really a pointer, "points" to your old data and it
won't get collected. Using a precise GC would eliminate that risk
I think.
This is rarely a problem though, as long as you either don't do
anything mandatory in destructors, or use `destroy` before
forgetting the data. The GC can still usually free the majority
of your memory.
More information about the Digitalmars-d-learn
mailing list