2016-02-11 152 views
3

当我做到以下几点:未处理的异常

float name[512][512][3] 

我得到这个大错误,使我打破。我正在使用Visual Studio。

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

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

我在我的智慧结尾!请帮助:)

+1

待办事项你知道'sizeof(float)* 512 * 512 * 3'需要多少内存,'static'是什么意思? –

+0

大约3兆字节?我相信静态把它放在堆的一部分,它可以存储更多的数据?我不太了解! – Jon

+0

“阵列不是那么大” - 它是3MB。虽然堆内存并不多,但它对于堆栈来说是很多**。你是否创建了这种类型的局部变量?考虑使用'std :: vector '而不是数组,或动态分配实例。 – Angew

回答

5

该阵列是3  MB(在大多数实现float)。这种大小的对象应该只能动态分配,而且对于驻留在堆栈上的MB太多了。

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

另一个我更喜欢使用std::vector<float>而不是3维数组,并将其作为存取函数实现索引。您甚至可以将这个向量存储在自己的类中,并将其用作您的name数据成员的类型。

第二个选项保证3&thinsp; 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; 
+0

我们之间的Fortran黑客不会将它称为'at' - 我们将其称为'operator()'。所以用法是'array3d(i,j,k)= 42.0f;'。 –

+0

感谢您的回应!我非常欣赏vector的代码,但它比我的水平稍高一点,我只想坚持我理解的东西。你能提供一个动态分配3D数组的例子吗?我试过“float * name = new float [512] [512] [3]”,无济于事 – Jon

+0

@MartinBonner这当然是一种可能性。或者它可以定义'operator []'返回一个链接'[i] [j] [k]'的代理。我只是展示了原则,真的。 – Angew