簡體   English   中英

Stackoverflow數組的數組

[英]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,這是一個壞主意。

好的,讓我們組裝所有的部分:

  • sizeof(array,1000>)大約是8Mbytes
  • 通常的堆棧較小,所以你在遇到問題時
    1. 創建這樣一個局部變量
    2. 按值傳遞它

如果堆棧具有較少的剩余空間,則行為未定義。 在調試版本中,您可能很幸運能得到相關的消息來解決它。 在典型的版本中,構建堆棧檢查結果並將您置於狂野狀態。

由於您的對象現在位於命名空間,因此只需通過引用傳遞即可解決問題。 無論如何,這通常是一個好主意。

如果您無法避免列出的有問題的用途,則必須減少班級大小。 最簡單的解決方案是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM