Debug help - Programming in D - extending tail slice terminates sharing unexpectedly. Page 69, 70

Kapendev alexandroskapretsos at gmail.com
Mon Oct 20 09:03:28 UTC 2025


On Sunday, 19 October 2025 at 20:44:39 UTC, Brother Bill wrote:
> But incrementing the length of tailSlice by 1 breaks sharing.
> This is unexpected.

This is not really unexpected.
It's easier to think about it if you treat slices as structs with 
2 members, a pointer and a length. The important member is the 
pointer.

```d
int[] slice = [1, 3, 5, 7, 9, 11, 13, 15];
```

Here you create a "struct" with a pointer provided by the GC. The 
GC keeps track of the amount of items this pointer is pointing 
to. It's not really important how it is tracked. The safest 
assumption a user can make in any language is that the pointer 
owns the memory.

```d
int[] tailSlice = slice[$ / 2 .. $];
```

Here you create a new "struct" whose pointer differs from 
`slice`. The layout of the data now looks like this:

```
`slice` pointer    : ...*########...
`tailSlice` pointer: .......*####...
```

The pointer of `tailSlice` doesn't own the memory. It's a view 
into the memory owned by the `slice` pointer.

```
tailSlice.length += 1;
```

You are now changing the length of struct `tailSlice`. There is 
really no good way to know if the pointer of `tailSlice` is an 
item of `slice` or if the last item of `tailSlice` is the last 
item of `slice`, so the GC will copy the data to a new memory 
block and append one new item.

That's kinda it. If you try to append or remove items in cases 
like this, you will probably get a new pointer. If you want to 
use a slice as a dynamic array, it's a good idea to pass it by 
`ref` or pointer. Hope this helps.


More information about the Digitalmars-d-learn mailing list