我正在尝试使用以下动态分配的数组:
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];
}
如何在不触发异常的情况下为我的一维数组分配内存?
答案 0 :(得分:2)
区别在于,在第一个代码段中,代码要求一个大块内存,大小为524288 * 524288 * sizeof(int)。在第二个代码中,代码要求一个大小为524288 * sizeof(int *)的块和524288个大小为524288 * sizeof(int)的块。
从内存管理的角度来看,较小的块通常更容易,因为它们更容易装入已分配的块之间。这就是注释所指的“堆碎片”-当程序分配一堆块并释放其中的一些块时,已释放的块会散布在尚未释放的块中。如果没有一个释放的块足够大,则分配一个大块可能会失败,而一堆较小的分配可能会成功,即使分配给较小块的内存量大于失败的大块也是如此。