Does the GC consider slice lengths?

Salih Dincer salihdb at hotmail.com
Sat Apr 2 05:49:07 UTC 2022


On Friday, 1 April 2022 at 16:24:33 UTC, Ali Çehreli wrote:
> void main() {
>   auto a = new int[1_000_000];
>
>   auto b = a[0..1];  // Hold on to the first element
>
>   a = a[$-1..$];     // Drop all but the last element
>
>   // Are the middle elements gone, or is b keeping
>   // them alive just because it still holds the very
>   // first pointer?
>
>   // Attempt to access original elements through
>   // a pointer to the first element. Bug?
>   auto c = b.ptr[0..1_000_000];
> }
>
> One assumption might be that the GC remembers the single large 
> allocation as one and all of the elements are still available? 
> But if it considers slices and their lengths specially, then it 
> would see that the mid section is not referenced any more.
> [...]

```d
import std.stdio;

// -- I couldn't type 32 here --v
enum testLimit = 1024 * 1024 * 31;
void main()
{
   char[] first ="a-123".dup;
   char* oneHalf = &first[2];      // =>[1]

   first.length = testLimit;
   first[$-1] = 'z';

   // legal? Ok.

   auto sliceLeft = first[0..2];   // "a-"
   auto sliceRight = first[$-2..$];// "�z"

   // legal? Ok.

   assert(first.length == testLimit);
   first = sliceLeft ~ sliceRight;
   assert(first.length == 4);

   char[] second = "b-321".dup;
   second.length = testLimit/2;

   first.writeln; // "a-�z"
   first.length = testLimit/2;
   first[0..2].writeln;

   // legal? Ok.

   auto numsMid = oneHalf[0..3];  // "123"
   numsMid.writeln;
   second[0..2].writeln;          // "b-"
}
```

In this 2nd test, I couldn't get the memory up to 62 MBytes. It 
throws the following error:
**(not a compiler error!)**

> core.exception.OutOfMemoryError at src/core/exception.d(702)

In the same system configuration and in my previous attempt, I 
had allocated all of the memory to an array. Let's get to the 
conclusion here: We need to do something to get the used memory 
back. But what?

SDB at 79



More information about the Digitalmars-d-learn mailing list