On Tuesday, 15 November 2022 at 02:26:41 UTC, Elfstone wrote:
I failed to find any documentation, except dynamic array slices will be taken care of by GC, but I assume it's not the case with static arrays.

A slice is a view on the existing memory owned by the original array. No allocations are made for the slice. The GC will track all references to the memory allocated for a dynamic array, so as long as any slices remain alive, so will the original memory.

Static arrays are allocated on the stack and become invalid when they leave a function scope. In turn, so would any slices or other pointers that reference that stack memory.


But the code bellow doesn't behave as I expected.

    int[] foo()
    {
        int[1024] static_array;
// return static_array[]; // Error: returning `static_array[]` escapes a reference to local variable `static_array`
        return null;
    }

    class A
    {
        this(int[] inData)
        {
                data = inData;
        }

        int[] data;
    }

    void main()
    {
        int[] arr;
        A a;
        {
                int[1024] static_array;
                arr = aSlice; // OK
                a = new A(aSlice); // OK
                arr = foo();
                //arr = foo();

        }
    }

By assigning aSlice to arr or a, it seemingly escapes the scope, I thought there'd be errors, but the code compiles just fine.

Is it really safe though?

It's not the scope that matters here. It's the stack. Memory allocated in the inner scope uses the function stack, so it's all valid until the function exits.


Reply via email to