根(CERN)中的数组声明中的'std :: bad_alloc',具体取决于数组大小

时间:2016-08-23 14:39:56

标签: c++ root-framework

我有一段代码声明了一个不一致编译的浮动3D数组。

void ImageCombine()
{

  float *doseArrayTotal = new float[2350][2350][2350];
  float *doseArray1 = new float[1175][1175][1175];
  // I have commented out the rest of my code whilst debugging.
}

如果doseArray1被赋予尺寸[2350] [2350] [2350]或[1024] [1024] [1024],它将被编译。鉴于[1175] [1175] [1175]或[1000] [1000] [1000]以上的尺寸,它将产生误差。

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

我运行此代码的方式是通过CERN开发的一个名为root(可怕名称)的软件,我提供的运行此函数的输入是。

[co@fastpc11 mysim]$ root
root [0] .L ImageCombine.C
root [1] ImageCombine()

关于为什么我的代码不会运行以及我如何能够解决这个问题的任何建议都将非常感激。

干杯 克里斯

1 个答案:

答案 0 :(得分:1)

最初发布的代码无效C ++;它恰好在由CERN Root解释时运行。要动态声明3D数组:

float*** doseArrayTotal = new float**[2350];
for(int i = 0; i < 2350; ++i){
  doseArrayTotal[i] = new float*[2350];
  for(int j = 0; j < 2350; ++j){
    doseArrayTotal[i][j] = new float[2350];
  }
}

使用向量做同样的事情:

vector<vector<vector<float> > > doseArrayTotal;
doseArrayTotal.resize(2350);
for (int i = 0; i < 2350; ++i) {
  doseArrayTotal[i].resize(2350);
  for (int j = 0; j < 2350; ++j){
    doseArrayTotal[i][j].resize(2350);
  }
}

这两个对象现在可用作3D矩阵或图像,并且可以在位置(1,2,3)存储或访问浮点数,例如:

float ValueEntered = 7.3;
float ValueExtracted;
doseArrayTotal[1][2][3] = ValueEntered;
ValueExtracted = doseArrayTotal[1][2][3];