How to delete dynamic array ?

jmh530 john.michael.hall at gmail.com
Wed Mar 17 16:06:06 UTC 2021


On Wednesday, 17 March 2021 at 14:30:26 UTC, Guillaume Piolat 
wrote:
> On Wednesday, 17 March 2021 at 10:54:10 UTC, jmh530 wrote:
>>
>> This is one of those things that is not explained well enough.
>
> Yes.
> I made this article to clear up that point: 
> https://p0nce.github.io/d-idioms/#Slices-.capacity,-the-mysterious-property
>
> "That a slice own or not its memory is purely derived from the 
> pointed area."
>
> could perhaps better be said
>
> "A slice is managed by the GC when the memory it points to is 
> in GC memory"?

I probably skimmed over the link when I originally read it 
without really understanding it. I'm able to understand it now.

I think the underlying issue that needs to get explained better 
is that when you do
int[] x = [1, 2, 3];
the result is always a GC-allocated dynamic array. However, z 
below
int[3] y = [1, 2, 3];
int[] z = y[];
does not touch the GC at all. For a long time, I operated under 
the assumption that dynamic arrays and slices are the same thing 
and that dynamic arrays are always GC-allocated. z is obviously a 
slice of y, but it is also a dynamic array in the sense that you 
can append to it and get an array with one more member than y 
(except in @nogc code). However, when appending to z, it seems 
that what's really happening is that the GC is allocating a new 
part of memory, copying over the original value of y and then 
copying in the new value. So it really becomes a new kind of 
thing (even if the type is unchanged).

One takeaway is there is no issue with a function like below
@nogc void foo(T)(T[] x) {}
so long as you don't actually need the GC within the function. A 
static array can be passed in just using a slice.


More information about the Digitalmars-d-learn mailing list