4

以下のような関数を使用して、いくつかの値を計算し、それらを変数に格納しています。

array<array<double,1000>,1000> index;
sum(double A, ..., array<array<double, 1000>,1000> & index);

配列のインデックス配列をざっと見てみると、上記の宣言を実行した直後に値が入力されています。大丈夫です

しかし!インデックス配列を使用する別の関数を呼び出すとすぐに、その宣言は次のとおりです。

average(..., array<array<double,1000>,1000> index, ...) 

asm ファイル (chkstk.asm) にリダイレクトする未処理の例外 (スタック オーバーフロー) が発生します。

 test    dword ptr [eax],eax     ; probe page.

これを解決する方法はありますか?

4

5 に答える 5

4

デフォルトでは、Win32 の各スレッドには 1 MB のスタック スペースがあり、100 万個の double は 8 MB のスタック スペースを占有します。解決策は、を使用してヒープからそれらを割り当てることnewです。

于 2013-06-19T11:28:51.450 に答える
3

2D で 1000 x 1000 の double を宣言する (スタック オーバーフローを避けるための) 動的な方法は次のとおりです。

std::vector<std::array<double,1000>> index(1000);

-編集- マイク・シーモアがコメントですでに提案したように。名誉は誰に与えられるべきか... ;)

Index はタイプstd::vector<std::array<double,1000>>であるため、そのような引数が必要です。

void average (..., std::vector<std::array<double,1000>> & index, ...)
于 2013-06-19T11:35:09.517 に答える
0

では、すべてのピースを組み立てましょう。

  • sizeof(array,1000>) は約8Mbyte
  • 通常のスタックは小さいため、次の場合に問題に直面します
    1. そのようなローカル変数を作成する
    2. 値渡し

スタックの残りのスペースが少ない場合の動作は未定義です。デバッグ ビルドでは、それを理解するための関連メッセージを取得できて幸運かもしれません。通常のリリースでは、ビルド スタックのチェックが行われ、あなたは危険にさらされます。

オブジェクトが名前空間に配置されるようになったので、参照渡しするだけで差し迫った問題を解決できます。とにかく、通常は良い考えです。

リストされた問題のある使用法を回避できない場合は、クラスのサイズを縮小する必要があります。最も簡単な解決策はvector<array<double,1000>>、サイズ コンストラクターを使用して作成し、すぐに全体のサイズを取得することです。

于 2013-06-19T11:52:37.603 に答える