[英]Stackoverflow arrays of arrays
我正在使用如下所示的函數計算一些值並將它們存儲在變量中:
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.
知道如何解決這個問題嗎?
默認情況下,Win32中的每個線程都有1 MB的堆棧空間,而一百萬的雙倍占用8 MB的堆棧空間。 解決方案是使用new
從堆中分配它們。
以2d方式聲明1000 x 1000雙倍的動態方式(避免堆棧溢出)是
std::vector<std::array<double,1000>> index(1000);
-edit-正如Mike Seymour在評論中已經提出的那樣。 榮譽歸於誰......;)
索引的類型為std::vector<std::array<double,1000>>
,因此您需要擁有類似的參數。
void average (..., std::vector<std::array<double,1000>> & index, ...)
好吧,既然你沒有將指針傳遞給普通函數的“索引”,你的對象(即數組)將在堆棧上重建(復制)。 我不知道默認情況下堆棧大小究竟是什么,但是你的陣列只用了大約8MB,這是一個壞主意。
好的,讓我們組裝所有的部分:
如果堆棧具有較少的剩余空間,則行為未定義。 在調試版本中,您可能很幸運能得到相關的消息來解決它。 在典型的版本中,構建堆棧檢查結果並將您置於狂野狀態。
由於您的對象現在位於命名空間,因此只需通過引用傳遞即可解決問題。 無論如何,這通常是一個好主意。
如果您無法避免列出的有問題的用途,則必須減少班級大小。 最簡單的解決方案是使用size構造函數創建vector<array<double,1000>>
,立即擁有整個大小。
我使用了一個對象( 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.