用户回调未处理的异常

时间:2016-02-11 14:54:20

标签: c++ visual-studio

当我执行以下操作时:

 float name[512][512][3]

我得到了这个大错误导致我破裂。我正在使用Visual Studio。

我注意到简单地将“静态”放在前面会导致错误消失,但我希望这是一个实例字段。我不确定为什么会发生这种情况 - 阵列不是那么大,我有一台强大的机器。

尝试[512] [512]打破了我,但[256] [512]完全没问题。

我的智慧结束了!请帮助:)

1 个答案:

答案 0 :(得分:5)

数组为3 MB(在大多数float的实现上)。这种大小的对象应该只能动态分配 - 3 MB对于驻留在堆栈上来说太过分了。

您有两种选择:一种是让您的班级保持原样,并确保您只是动态分配它(使用智能指针中拥有的new)。

另一个我更喜欢的是使用std::vector<float>而不是三维数组,并将其作为访问器函数实现索引。你甚至可以包装这个矢量&amp;自己的类中的访问器,并将其用作name数据成员的类型。

第二个选项可确保3 MB数据永远不会驻留在非动态内存中。

以下是这种3D可访问vector的一个可能草图:

template <class T, size_t Dim1, Dim2, Dim3>
class Array3d
{
  std::vector<T> data;

public:
  Array3d() : data(Dim1 * Dim2 * Dim3) {}

  T& at(size_t idx1, size_t idx2, size_t idx3)
  { return data[idx1 * Dim2 * Dim3 + idx2 * Dim3 + idx3); }

  T at(size_t idx1, size_t idx2, size_t idx3) const
  { return data[idx1 * Dim2 * Dim3 + idx2 * Dim3 + idx3); }
};

更基本的替代方案是动态分配数组本身:

using Array2d = std::array<std::array<float, 3>, 512>;
std::unique_ptr<Array2d[]> name{new Array2d[512]};
name[i][j][k] = 42.0f;