0

大きな配列を持つクラスを含む C++ で書かれた小さなプログラムがあります。クラスは次のようになります。

class Test
{
public:
    Test();
    ...
private:
    int myarray[45000000];
};

これで、この配列がファイルから読み込まれます。わざわざ余分な関数を呼び出すのではなく、コンストラクターで直接これを行いたいと思います。配列は一度だけ読み込む必要があり、その後は変更されません。指定された正確なサイズがあります。

私のコンストラクタは次のようになります。

Test()
{
   memset(myarray, 0, sizeof(myarray));
   FILE* fstr = fopen("myfile.dat", "rb");
   size_t success= fread(myarray, sizeof(myarray), 1, fstr);
   fclose(fstr);
}

Visual Studio 2012 Ultimate の使用: このクラスを使用するプログラムを起動しようとすると、クラスが作成されるとすぐに「APPCRASH」でクラッシュし、デバッグしようとすると (ほとんど知識がありません)、エラーはスタックオーバーフローだと思います。

このすべての謎は、myarray が静的変数であり、それを設定するために静的関数を呼び出す必要があった私の以前のバージョンでは、すべてがうまくいったことです。しかし、これをコンストラクターに変換しようとすると、私の試みはすべて失敗します。

それで、私はここで何が間違っていますか?

4

3 に答える 3

3

おそらくあなたはあなたのメイン(または他のどこか)でこれを行うでしょう

int main ()
{
  Test t; // Hello StackOverflow
}

必要なのは、ヒープに割り当てることです。

int main ()
{
  Test* t = new Test;
  delete t;
}

静的変数がスタックに割り当てられていないため、静的変数でクラッシュしませんでした

于 2013-02-28T13:46:06.803 に答える
3

int最小サイズが 2 バイトの場合でも、配列は約 86MB のメモリを使用します。通常の最大スタック サイズは 1MB です。オブジェクトのストレージTestがスタックに割り当てられている場合、簡単にオーバーフローします。配列を動的に割り当てるか、一度にすべてをメモリにロードしないようにする必要があります。さらに良いのは、要素に動的割り当てを使用する標準コンテナー (std::vector.

于 2013-02-28T13:42:46.803 に答える
3

クラスでのこの宣言:

int myarray[45000000];

45,000,000 * int あたり 4 バイト (32 ビットを想定) = 180MB のメモリを割り当てようとしています。スタックがそれをサポートする方法はありません。ファイルの読み込み方法を変更するには、アプリを再設計する必要があります。

于 2013-02-28T13:43:53.003 に答える