分配数组时异常,将其分配为2D数组时也不例外

时间:2019-01-19 11:25:38

标签: c++ arrays new-operator dynamic-memory-allocation

我正在尝试使用以下动态分配的数组:

long currsize = 524288;
int *insertedEdges = new int[currsize*currsize]; 

但是当我运行此代码时,我的程序终止并显示一条错误消息:

terminate called after throwing an instance of 'std::bad_alloc'

但是,如果我将相同的数组转换为2D数组并分配相同的内存量,则在循环中使用new,就会分配内存:

printf("ALLOCATIONS START \n");
int **insertedEdges = new int*[currsize];
for(int i = 0; i < currsize; i++) {
    insertedEdges[i] = new int[currsize];
}    

如何在不触发异常的情况下为我的一维数组分配内存?

1 个答案:

答案 0 :(得分:2)

区别在于,在第一个代码段中,代码要求一个大块内存,大​​小为524288 * 524288 * sizeof(int)。在第二个代码中,代码要求一个大小为524288 * sizeof(int *)的块和524288个大小为524288 * sizeof(int)的块。

从内存管理的角度来看,较小的块通常更容易,因为它们更容易装入已分配的块之间。这就是注释所指的“堆碎片”-当程序分配一堆块并释放其中的一些块时,已释放的块会散布在尚未释放的块中。如果没有一个释放的块足够大,则分配一个大块可能会失败,而一堆较小的分配可能会成功,即使分配给较小块的内存量大于失败的大块也是如此。