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