как преднамеренно вызвать исключение StackOverflowException без использования рекурсии?

#c# #.net #recursion #stack-overflow

#c# #.net #рекурсия #переполнение стека

Вопрос:

Мне сказали, что каждый метод имеет стек размером 1 мб. Итак, я предположил, что инициализация 256 целочисленных значений в одном методе вызовет исключение StackOverflowException. Я пробовал это в коде, но исключение не было выдано.

Итак, как преднамеренно вызвать исключение StackOverflowException без использования рекурсии?

Комментарии:

1. 256 * 4 байта = 1 КБ, а не 1 МБ

2. 256 целых чисел = 256 * 4 байта = 1024 байта = 1 КБ, а не 1 МБ. Для этого вам понадобится 256000 целых чисел. И я бы даже не пытался писать код с 256000 объявлениями. (редактировать: и Марк Гравеллс всегда быстрее) 🙂

3. Было бы довольно плохо, если бы вы могли использовать только 256 * 4 байты памяти в одном методе… С другой стороны, это, вероятно, помогло бы сохранить методы небольшими! 🙂

Ответ №1:

используйте

 throw new StackOverflowException ();
  

Комментарии:

1. 1. Всегда используйте самый простой подход, который дает нужный вам результат? 🙂

Ответ №2:

stackalloc вероятно, это самый простой способ (при условии, что вы хотите, чтобы среда выполнения выдавала ошибку, а не вы сами):

     unsafe void Boom()
    {
        int* data = stackalloc int[512 * 1024]; // 2MB
    }
  

Комментарии:

1. есть ли какая-либо разница при использовании в 64-битной системе? Стек больше?

Ответ №3:

Я добавлю еще один метод 🙂

 unsafe struct FixedBufferExample
{
    public fixed byte Buffer[128 * 1024]; // This is a fixed buffer.
}
  

Теперь эта структура составляет 128 КБ 🙂 Если вы объявляете локальную переменную (метода, который не использует yield или async) типа FixedBufferExample , она должна использовать 128 КБ стека. Вы можете использовать свой стек довольно быстро.