程序消耗太多RAM

时间:2017-04-01 15:52:10

标签: c++ memory-management

我正在尝试运行一个简单的代码来创建一个2D数组。起初我正常地声明了数组,但它终止了异常。

在任务管理器中,程序通常会增加到0.4 MB的大小并被终止。因此,经过一些研究,我发现了堆,因此试图存储在那里。这次花了将近3 GB,我的操作系统由于内存不足而重新启动。

int main()
{
    for(int i=0;i<1000;i++)            // outer loop to create 1000 instances
    {
        int** c = new int*[3000];         // creating 2D array of size 3000*3000
        int** b = new int*[3000];

        for(int z=0;z<3000;z++)
        {
            c[z] = new int[3000];
            b[z] = new int[3000];
        }

    }
    return 0;
}

所以,据我所知,c的最大大小是[3000] [3000] = 36 * 10 ^ 6 B = 36 MB

现在我有4GB的RAM,所以这看起来很不公平。

无论如何我明白C ++没有自动垃圾收集;这就是遗骸被遗漏的原因。但是,我需要这个数组结构进行计算。如何让它使用更多的可用内存?

2 个答案:

答案 0 :(得分:2)

看起来你对new如何工作(以及如何使用它)有错误的想法。基本上,您的代码分配方式超过3000 x 3000整数。

除此之外,我建议将2D阵列折叠成一维阵列。我还建议改为使用std::vector<int>

如果你已经开始自己分配内存,你可以使用:

int* array = new int[3000 * 3000];

然后最终调用delete释放内存,如:

delete[] array;

以下是一个例子:

int main()
{
    int* array = new int[3000 * 3000];
    // assume that array now points to un-initialized memory
    // i.e. don't assume any array element has any particular value
    //    until you set the value of the element.

    for (int i = 0; i < 3000; ++i)
    {
        for (int j = 0; j < 3000; ++j)
        {
             // To store a value...
             int yourvalue = i * 3000 + j; // or whatever value it is you want to store
             array[i * 3000 + j] = yourvalue;

             // Or to read a value...
             yourvalue = array[i * 3000 + j];
        }
    }
    delete [] array;
}

希望这能解决您如何在不消耗太多内存的情况下创建和使用3000 x 3000大小的内存缓冲区的问题。当然,这假设您的系统至少有3000 * 3000 * sizeof(int)的内存空间。其中,如果sizeof(int) == 4(通常是),则大约为36MB。

答案 1 :(得分:1)

您有2 * sum{ 0 ~ 2999 } = 2 * 2999 * 3000 / 2 = 8,997,000 int*个,int*个点int[3000]

如果假定为sizeof(int*) == 8sizeof(int) == 4,则程序所需的内存大小为8997000 * (8 + 3000 * 4) = 108,035,976,000个字节。

108,035,976,000字节&gt; 105,503,882 KiB> 103,031 MiB&gt; 100 GiB。我认为你的机器不支持100 GiB大小的内存空间。