0

私はSDLライブラリを使用してプログラムを開発しています。すべてが Linux で行われ、完全に動作しますが、Windows に移植するときに問題が発生します。プログラムをビルドして実行するとクラッシュ (プログラムが動作を停止) して閉じます。最初は SDL と関係があると思いましたが、2 次元配列またはクラスのオブジェクトを定義する行にエラーを分離しました。 . クラス プロトタイプは、次のようにヘッダー ファイルで定義されます。

#ifndef PARTICULA_H
#define PARTICULA_H

class particula {
    public:
    particula();
    particula(const particula& orig);
    virtual ~particula();

    int x,y;
    int vx,vy;
    int tipo;
    int tipo2;
    int peso;
    int empuje;
    bool update;
    bool update_temp;
    int contador;
    int temperatura;
};

#endif

現在、その .cpp ファイルで定義されているクラス コンストラクター

particula::particula() {
    vx = 0; vy = 0; tipo = 0; peso = 0; empuje = 0; 
    update = true; contador = 0; temperatura = 0;
    update_temp = true; tipo2 = 0;
}

particula::particula(const particula& orig) {
}

particula::~particula() {
}

さて、main() 関数では、最初に、このクラスの配列を定義します。

particula matriz[400][220];

ビルドして実行するとプログラムがクラッシュしますが、その行をコメントしてもプログラムはクラッシュしません。それ以外のことはできません。それを見つけるために関数全体にコメントを付けたmainので、その行だけが実行されます。どうなり得るか?私は何か間違ったことをしていますか?

4

2 に答える 2

2

スタックにこのような大きな配列を割り当てると、クラッシュが発生すると思います。この行を main 関数に書きましたが、新しい演算子が表示されません。したがって、スタック上の構造にメモリを割り当てます。スタックはそれほど多くのデータを収めることができません... new キーワードを使用してメモリをヒープに割り当て、後で解放することを忘れないでください。 この記事を読んでください。

于 2013-02-09T22:31:54.287 に答える
0

Windows のスタック スペースの最大量はデフォルトで 1 MB ですが、そのアレイには約 4 MB が必要です。したがって、ヒープに割り当てる必要があります。

particula (*matriz)[220] = new[400][220];

または:

vector<vector<particula>> matriz;

そして、必要に応じて要素を追加します。

于 2013-02-09T22:41:00.477 に答える