首页 > 解决方案 > 分配数组时出现异常,将其分配为二维数组时也不例外

问题描述

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

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];
}    

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

标签: c++arraysnew-operatordynamic-memory-allocation

解决方案


不同之处在于,在第一个片段中,代码要求一个大内存块,大小为 524288*524288*sizeof(int)。在第二个中,代码要求一个大小为 524288*sizeof(int*) 的块和 524288 个大小为 524288*sizeof(int) 的块。

从内存管理的角度来看,较小的块通常更容易,因为它们更容易放入已分配的块之间。这就是评论所说的“堆碎片”——当程序分配一堆块并释放其中一些块时,被释放的块散布在尚未释放的块之间。如果释放的块都不足以容纳该块,则分配大块可能会失败,而一堆较小的分配可能会成功,即使分配给较小块的内存量大于失败的大块。


推荐阅读