当我执行以下操作时:
float name[512][512][3]
我得到了这个大错误导致我破裂。我正在使用Visual Studio。
我注意到简单地将“静态”放在前面会导致错误消失,但我希望这是一个实例字段。我不确定为什么会发生这种情况 - 阵列不是那么大,我有一台强大的机器。
尝试[512] [512]打破了我,但[256] [512]完全没问题。
我的智慧结束了!请帮助:)
答案 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;