【问题标题】:why bad_alloc message show me after running my code为什么在运行我的代码后显示 bad_alloc 消息
【发布时间】:2021-02-10 17:01:22
【问题描述】:

此代码显示消息“在抛出 'std::bad_alloc' 实例后调用终止 什么():std::bad_alloc

进程返回 3 (0x3) 执行时间:0.331 s" 我无法确定的问题在哪里。我使用了代码块。我的电脑内存是 8GB。

#include <iostream>
#include<vector>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <sstream>

using namespace std;

int main(){

ofstream bcrs_tensor;
bcrs_tensor.open("bcrs_tensor_Binary", ios::out | ios::binary);

int X=6187,Y=25,Z=78,M=33;



int new_dimension_1,new_dimension_2,new_x_1,new_x_2;
new_dimension_1=X*Z;
new_dimension_2=Y*M;

int* new_A = new int[ new_dimension_1*new_dimension_2 ];

vector<int> block_value,CO_BCRS,RO_BCRS;
block_value.reserve(303092010);
CO_BCRS.reserve(1554318);
RO_BCRS.reserve(37124);
cout<<"size"<<sizeof(block_value)<<endl;
return 0;
}

【问题讨论】:

  • 确保你是为 x64 架构构建的,x32 的上限是 2GB,而你已经接近这个上限了。
  • new int[ new_dimension_1*new_dimension_2 ] 需要大约 2GB 的内存。您的向量需要另外 1-1.5 GB 的内存。您是否有足够的能力来涵盖这一点,并且还知道这些夹头需要是连续的。
  • 有什么办法可以解决这个问题吗? @Yksisarvinen
  • @SafayetHossainSobuj 是的 - 重新设计你的代码,不要一次分配这么多内存。或者为 64 位系统编译你的代码。
  • @SafayetHossainSobuj 您没有展示您实际使用分配的所有内存在做什么,但设计合理的算法很少需要分配 2GB 的 内存 来处理 2GB 数据.

标签: c++ memory storage tensor bad-alloc


【解决方案1】:

您正在尝试分配比系统为您的应用程序可用的内存更多的内存,因此std::bad_alloc 被抛出,而您没有捕捉到。

假设您的编译器中有sizeof(int)=4,您要求:

  • 1.48GB 用于new_A
  • 1.12GB 用于block_value
  • 5.92MB 用于CO_BCRS
  • 145KB 用于RO_BCRS

总共 2.61GB

即使您安装了 8GB 的​​ RAM,您的系统也没有足够的连续内存来满足这些分配之一(即,如果它是一个 32 位应用程序,整个过程仅限于最大 2-3GB,取决于配置、内存管理器实现等。但其中很大一部分是由操作系统本身保留的,您不能将其用于您的代码)。

【讨论】:

  • 我正在使用 64 位应用程序。但我该如何解决这个问题?请帮帮我..
  • 即使在 64 位系统中,您仍然需要一次 连续 GB 的内存,因此仍然无法保证系统可以分配如此大量的内存连续。同样,您确实需要重新设计代码以一次使用更少的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多