我正在尝试运行一个简单的代码来创建一个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 ++没有自动垃圾收集;这就是遗骸被遗漏的原因。但是,我需要这个数组结构进行计算。如何让它使用更多的可用内存?
答案 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*) == 8
和sizeof(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大小的内存空间。