2015-03-29 1 views
4

Я получаю исключение из памяти, и я не знаю почему? Это мой C# код:OutOfMemoryException при заполнении Список <byte> в C#

List<byte> testlist = new List<byte>(); 
      for (byte i = 0; i <= 255; i++) 
      { 
       testlist.Add(i); //exception thrown here in the last cycle 
      } 
+0

Это 32-битный процесс? Каково ваше потребление памяти? –

+0

Возможно, вам стоит научиться избегать использования циклов 'for' в' C# '. – Aron

ответ

11

Ваш цикл никогда не заканчивается, потому что byte является беззнаковым, 8-разрядным целым числом с действительными значениями в диапазоне от 0 до 255.

Так что, когда i == 255 и тело цикла завершается , происходит другое приращение. Однако из-за диапазона byte это не вызывает i равным 256 (он не может!), Что, в свою очередь, приведет к завершению цикла. Вместо этого он переполняется и перекатывается до 0. Итак, цикл продолжается (и снова и снова ...). Это относительно распространенная ошибка при использовании счетчиков циклов без знака.

Тем временем ваш список растет, пока вы не запустите OOM. Здесь нет оснований использовать byte; просто используйте int и добавьте его в свой список: i.

+0

также вы (OP) можете использовать ['checked'] (https://msdn.microsoft.com/en-us/library/74b4xzyw.aspx), чтобы проверить это;) – Carsten

+0

Так что это работает: Список testlist = new Список (); for (int i = 0; i <= 255; i ++) { testlist.Add ((byte) i); } – romanoza

+0

@ CarstenKönig Ah, не знал о 'checked'. Не хотел бы использовать его явно везде. ;) – MickyD

Смежные вопросы