c++ - 分配数组时出现异常,将其分配为二维数组时也不例外
问题描述
我正在尝试使用以下动态分配的数组:
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];
}
如何在不触发异常的情况下为我的一维数组分配内存?
解决方案
不同之处在于,在第一个片段中,代码要求一个大内存块,大小为 524288*524288*sizeof(int)。在第二个中,代码要求一个大小为 524288*sizeof(int*) 的块和 524288 个大小为 524288*sizeof(int) 的块。
从内存管理的角度来看,较小的块通常更容易,因为它们更容易放入已分配的块之间。这就是评论所说的“堆碎片”——当程序分配一堆块并释放其中一些块时,被释放的块散布在尚未释放的块之间。如果释放的块都不足以容纳该块,则分配大块可能会失败,而一堆较小的分配可能会成功,即使分配给较小块的内存量大于失败的大块。
推荐阅读
- python - 为什么在为我的误差线定义“capsize”时会得到一个无效的 RGBA 参数 ValueError?
- javascript - 实现顺序回调执行
- c# - 如何检索 mdb 文件的位置并将其用作 c# 中的驱动程序
- javascript - 如何“访问对象 javascript”
- racket - 数据/集合中的球拍序列与内置序列
- tensorflow - How to run tensorflow model on Coral CPU
- ruby-on-rails-5 - 更新公用文件夹文件但不想在部署后重置
- amazon-web-services - 在 AWS Cloudfront CDN 中计算数据传出
- bash - 如何从 Oracle 中的 heredoc 将数据传递给 INPUT HIDE?
- java - 如何从字节数组中复制字节部分?