1

以下のコードを実行すると、「StackOverflowException によりプロセスが終了しました」というエラーが表示されます。63993 を 63992 以下に変更しても、エラーは発生しません。構造体を 100,000 以上に初期化したいと考えています。

#include <Windows.h>
#include <vector>

using namespace std;

struct Point
{
    double x;
    double y;
};

int main()
{
Point dxF4struct[63993]; // if < 63992, runs fine, over, stack overflow
Point dxF4point;
vector<Point> dxF4storage;

for (int i = 0; i < 1000; i++) {
dxF4point.x = i;    // arbitrary values             
dxF4point.y = i;
dxF4storage.push_back(dxF4point);
}

for (int i = 0; i < dxF4storage.size(); i++) {
    dxF4struct[i].x = dxF4storage.at(i).x;
    dxF4struct[i].y = dxF4storage.at(i).y;
}

Sleep(2000);
return 0;
}
4

4 に答える 4

3

スタックスペースが不足しているだけです。無限ではないため、不足しないように注意する必要があります。

3 つの明白な選択肢:

  1. 使用するstd::vector<Point>
  2. グローバル変数を使用します。
  3. 動的割り当てを使用しPoint *dxF4struct = new Point[64000]ます。最後に電話することを忘れないでくださいdelete [] dxF4struct;

以上、良いと思う順に並べてみました。

[技術的には、他の誰かがそれを指摘する前に、はい、スタックを増やすことができますが、それは実際には問題をどこか別のレベルに移動させるだけであり、それを続けて大きな構造をスタックに置くと、不足します。スタックをどれだけ大きくしても、最終的にはスタックの数]

于 2013-01-30T02:44:16.713 に答える
1

スタック サイズを増やします。Linux では、ulimitを使用して、スタック サイズのクエリと設定を行うことができます。Windows では、スタック サイズは実行可能ファイルの一部であり、コンパイル中に設定できます。

スタック サイズを変更したくない場合は、new演算子を使用して配列をヒープに割り当てます。

于 2013-01-30T02:42:39.670 に答える
1

スタック オーバーフローが発生しているため、割り当てられたスタックがこの量のデータに対して小さすぎます。コンパイラーに実行可能ファイルにより多くのスペースを割り当てるように指示することもできますが、ヒープ (std::vector、既に使用しています) に割り当てることをお勧めします。

于 2013-01-30T02:43:10.143 に答える
1
Point dxF4struct[63993]; // if < 63992, runs fine, over, stack overflow

その行では、すべての Point 構造体をスタックに割り当てています。スタックの正確なメモリ サイズはわかりませんが、デフォルトは約 1Mb です。構造体は 16 バイトであり、63393 を割り当てているため、16 バイト * 63393 > 1Mb となり、スタック オーバーフローが発生します (スタック オーバーフローでスタック オーバーフローを起動する面白い投稿...)。

そのため、環境により多くのスタック領域を割り当てるように指示するか、オブジェクトをヒープに割り当てることができます。

Point 配列をヒープに割り当てると、100,000 を簡単に割り当てることができるはずです (メモリが 1Mb 未満の組み込み proc でこれが実行されていないと仮定します)。

Point *dxF4struct = new Point[63993];

コメンターが書いたように、ヒープに「新しい」メモリを作成する場合、メモリを「削除」するのはあなたの責任であることを知っておくことが重要です。これは arrayを使用するため、対応する配列演算子new[]を使用する必要があります。delete[]最新の C++ には、配列の有効期間の管理に役立つスマート ポインターがあります。

于 2013-01-30T02:41:23.823 に答える