为什么在尝试创建大小为int.MaxValue的int数组时会出现OutOfMemoryException

时间:2011-12-18 11:18:47

标签: c# arrays int

我正在尝试创建一个包含所有正整数的数组,我尝试了以下代码并且它总是抛出内存异常。

private int[] AllIntegers()
{
    int[] all = new int[int.MaxValue];

    for (int i = 0; i < int.MaxValue; i++)
    {
        all[i] = i;
    }

    return all;
}

我做错了什么?或者这根本不可能?!

3 个答案:

答案 0 :(得分:0)

您正在尝试分配大约4 *(2 ^ 32 -1)字节的内存。这恰好是8GB,可能比您的系统提供的更多,或者更确切地说是您的流程可以分配的内容。

答案 1 :(得分:0)

如果您使用的是32位操作系统(在64位操作系统上可能会更改),则整数为4个字节(32位)。因此int.MaxValue是2 ^ 31(2 ^ 31 signed,2 ^ 31 unsigned),因此您尝试分配2 ^ 31个整数的数组。将此值乘以4个字节,即可获得8589934592个字节,即8 GB。

答案 2 :(得分:0)

正如其他人所说,你不能同时将所有信息保存在内存中。要获取所有自然数的列表,只需使用迭代器块,它一次只在内存中保存一个int,加上方法状态信息:

static void Main (string[] args)
{
    foreach (int i in Program.NaturalNumbers ())
    {
        Console.WriteLine (i);
    }
}

public static IEnumerable<int> NaturalNumbers ()
{
    for (int i = 0; i <= int.MaxValue; i++)
    {
        yield return i;
    }
}