@daniil14056

Откуда stackoverflow при работе с stackalloc c#?

var test_2 = () =>
     { 
    int n = 200_000;
    int k =1;
         for (int i = 0; i < n; i++)
         {
             Span<int>arr =  stackalloc int[k];  
         } 
     };

Почему локальная переменная Spanarr = stackalloc int[k]; не освобождает стек после завершения ????
как делитить или dispose-ить???
Я просто взял пример https://learn.microsoft.com/ru-ru/dotnet/csharp/la... и закинул в цикл, что обычно и бывает с данными.
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
@mvv-rus
Настоящий админ AD и ненастоящий программист
Похоже (явного указания в документации я не нашел), что память в стеке освобождается только при выходе из всего метода, но не из блока внутри него. Освобождение памяти в стеке, как известно - это сдвиг указателя стека обратно, и похоже, этого в конце блока не происходит - только в конце метода. Косвенное подтверждение - в документации по stackalloc явно написано избегать вызовов stackalloc в цикле, как это у вас сделано: "Avoid using stackalloc inside loops. Allocate the memory block outside a loop and reuse it inside the loop." ( https://learn.microsoft.com/en-us/dotnet/csharp/la... )
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
по умолчанию размер стека 1 мб. у вас просто забивает стек, ну а выше написали уже. Да и если бы вы в куче выделяли бы так же, уборка мусора не происходит сразу, по выходу из зоны видимости переменной.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы