How to free memory ater use of "new" to allocate it.
Steven Schveighoffer
schveiguy at gmail.com
Sun Jul 16 20:51:55 UTC 2023
On 7/16/23 2:41 PM, Alain De Vos wrote:
> Is this ok ?
> ```
> void main(){
> int[] i=new int[10000];
> import object: destroy;
> destroy(i);
> import core.memory: GC;
> GC.free(GC.addrOf(cast(void *)(i.ptr)));
> }
> ```
No, that won't work. Check out `i` value after you call `destroy` on it:
```d
destroy(i); // basically sets i = null
assert(i.ptr is null); // yep
GC.free(i.ptr); // basically free(null) which is a no-op
```
Also note that `destroy` is *shallow*. It does not dig into pointers or
arrays. So even if your array was of elements with a destructor,
destroying the array doesn't destroy the elements.
In this case, all you need to do is:
```d
GC.free(GC.addrOf(i.ptr));
```
You don't need the cast here. You shouldn't need the addrOf, but this is
still open: https://issues.dlang.org/show_bug.cgi?id=13558
-Steve
More information about the Digitalmars-d-learn
mailing list