【问题标题】:'std::bad_alloc' in array declaration in root(CERN), depending on array size根 (CERN) 中的数组声明中的“std::bad_alloc”,取决于数组大小
【发布时间】:2016-12-30 11:04:59
【问题描述】:

我有一段代码声明了一个编译不一致的 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()

任何关于为什么我的代码无法运行以及我如何解决这个问题的建议将不胜感激。

干杯 克里斯

【问题讨论】:

  • 您试图分配过多的连续内存,您的机器没有足够的堆空间。这就是为什么当你减少数组维度时它起作用的原因。您需要考虑一种解决方法,例如更小的存储方案。
  • 如果您已经将float 数组作为浮点指针处理,那么类型不应该是float***吗?
  • 代码是非法的 C++。尝试使用真正的 C++ 编译器对其进行编译。 IIRC ROOT 允许加载完整的垃圾,然后在运行时崩溃。
  • @ArnavBorborah 堆栈中的数组会使情况变得更糟,没有区别。
  • “它可以始终与较大的阵列一起运行,但始终不能与某些较小的阵列一起运行” 也许您应该向负责 ROOT 的人员投诉。 C++ 通常不会以这种方式工作。无论如何,您的程序都是合法的 C++,所以我不知道如何在 C++ 端修复它,当然除了使其合法 C++。

标签: c++ root-framework


【解决方案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];

【讨论】:

  • 请编辑您的原始帖子,而不是添加带有改进的答案。
  • @KevinKatzke 以前没在这里写过,只是来这里搜索类似的问题。另一个用户建议将我的解决方案发布在答案部分,这不是正确的礼仪吗?
  • 我明白了,那么您应该接受自己的答案(单击“检查”图标),以澄清您想与社区分享的最初问题的解决方案。
  • “明天你可以接受你自己的答案”。不过我会做的,谢谢你
  • @Kevin - 查看问题的 cmets(如果它们仍然存在)。像这样将向量分解成不连续的块解决了 Chris 的问题(它可能会有一些性能损失,但没有比崩溃更糟糕的惩罚!),我说把它作为答案发布。这不是澄清,而是为了解决问题而做出的改变,因此自我回答是正确的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多