@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... и закинул в цикл, что обычно и бывает с данными.
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 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 мб. у вас просто забивает стек, ну а выше написали уже. Да и если бы вы в куче выделяли бы так же, уборка мусора не происходит сразу, по выходу из зоны видимости переменной.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы