我正在计算一些值,并使用类似下面的函数将它们存储在变量中:
array<array<double,1000>,1000> index;
sum(double A, ..., array<array<double, 1000>,1000> & index);
我快速观察数组的索引数组,并在执行上述声明时填充值。没关系
但是!只要我调用另一个使用索引数组的函数,其声明如下:
average(..., array<array<double,1000>,1000> index, ...)
我收到一个未处理的异常(Stack Overflow),它将我重定向到asm文件(chkstk.asm):
test dword ptr [eax],eax ; probe page.
知道如何解决这个问题吗?
答案 0 :(得分:4)
默认情况下,Win32中的每个线程都有1 MB的堆栈空间,一百万的双倍占用8 MB的堆栈空间。解决方案是使用new
从堆中分配它们。
答案 1 :(得分:3)
以2d方式声明1000 x 1000双打的动态方式(避免堆栈溢出)是
std::vector<std::array<double,1000>> index(1000);
CNC中 正如Mike Seymour在评论中已经提出的那样。荣誉归于谁......;)
索引的类型为std::vector<std::array<double,1000>>
,因此您需要拥有类似的参数。
void average (..., std::vector<std::array<double,1000>> & index, ...)
答案 2 :(得分:0)
好吧,既然你没有将指向“index”的指针传递给普通函数,你的对象(即数组)将在堆栈上重建(复制)。 我不知道默认情况下堆栈大小究竟是什么,但是你的阵列只使用了大约8MB,这是一个坏主意。
答案 3 :(得分:0)
好的,让我们组装所有部分:
如果堆栈剩余空间较少,则行为未定义。在调试版本中,您可能很幸运能得到相关的消息来解决它。在典型的版本中,构建堆栈检查结果并将您置于狂野状态。
由于您的对象现在位于命名空间,因此可以通过引用传递它来解决当前问题。无论如何,这通常是一个好主意。
如果无法避免列出的有问题的用途,则必须减少班级大小。最简单的解决方案是使用size构造函数创建它vector<array<double,1000>>
,立即拥有整个大小。
答案 4 :(得分:0)
我用一个对象(Model model = new Model;
)存储了一些矢量(数组)。
float fc1[input_dim][hidden_layer_dim_1] = { 0.0 };
float fc2[hidden_layer_dim_1][hidden_layer_dim_2] = { 0.0 };
float fc3[hidden_layer_dim_2][output_dim] = { 0.0 };
我收到此错误,因为尺寸有点大:)。我通过此更改解决了该问题:
Model model;
->> Model *model = new Model;
。
当我使用指针时,问题已解决。当然,变量是与此相关的:
model.hidden_layer_dim_1
-> model->hidden_layer_dim_1