0

Dungeon クラスのインスタンスを作成すると、スタック オーバーフロー エラーが発生します。私のダンジョンクラスが部屋の配列を作成し、私の部屋がセルの配列を作成するためだと思います。私の唯一の質問は、以前にこれを行ったことがあり、この問題が発生したことがないことです。では、今回は何が間違っているのでしょうか。配列が大きすぎますか? 部屋の配列を最大 [5][3] まで作成できますが、[5][5] サイズの部屋にしたいと考えています。これだけでは無理ですか?

スタック オーバーフロー エラーは、スタックのメモリが不足したときに発生することは理解していますが、そのスタックを終了して、最初からやり直すことができるようになったことをどのように知ることができますか? それとも、そのスタックから何かが取り除かれたときですか?

これらの 3 つのクラスがどのようにセットアップされるかについての私のコード (Dungeon.h) は次のとおりです。

#ifndef DUNGEON_H
#define DUNGEON_H

#include <stdlib.h>
#include <string>
#include "TextureHandler.h"
#include "Room.h"

using namespace std;

class Dungeon
{
public:
    Dungeon();
    ~Dungeon();

private:
    static const int MAX_RM_ROWS = 5;   //Maximum amount of rows of rooms we can have
    static const int MAX_RM_COLS = 5;   //Maximum amount of columns of rooms we can have
    Room rooms[5][5];

    int currentDungeon;                 //Stores the ID of the current dungeon we are in.
    int currentRoomRow;                 //Stores the row position in the room array for what room the player is in
    int currentRoomCol;                 //Stores the column position in the room array for what room the player is in
protected:

};

#endif

ルーム.h

#ifndef ROOM_H
#define ROOM_H

#include <stdlib.h>
#include "Cell.h"

using namespace std;

class Room
{

public:
    Room();
    ~Room();
    void draw();
    void setupCell(int row, int col, float x, float y, float width, float height, bool solid, vector<float> texCoords);
    int getMaxRows();
    int getMaxCols();
private:
    static const int MAX_ROWS = 30;
    static const int MAX_COLS = 50;
    Cell cells[MAX_ROWS][MAX_COLS];

protected:
};

#endif

Cell.h

 #ifndef CELL_H
    #define CELL_H

    #include <stdlib.h>
    #include <vector>
    #include "GL\freeglut.h"

    using namespace std;

    class Cell
    {
    public:
    Cell();
    ~Cell();
    void setup(float x, float y, float width, float height, bool solid, vector<float> texCoords);
    void draw();
    float getX();
    float getY();
    float getWidth();
    float getHeight();
    bool isSolid();
    private:
    float x;
    float y;
    float height;
    float width;
    bool solid;
    vector<float> texCoords;
    protected:

    };

    #endif
4

4 に答える 4

2

あなたCellは約32バイトです(またはaのサイズに応じてもう少しvector<float>)。部屋ごとに 1500 個のセルがあります。ダンジョンごとに 25 の部屋があります。したがって、ダンジョンごとに少なくとも 32 x 1500 x 25 = 1.2 MB が必要です。これは非常に大きいですが、構造体を動的に割り当てる場合、通常は大きな問題にはなりません。スタック上にローカル インスタンスを作成しようとすると、スタックが簡単に壊れてしまう可能性があります。

したがって、ダンジョンを動的に割り当てれば問題ありません。それらをローカル変数として作成しないでください。

コピー コンストラクターを非表示にして、Dungeon を値では渡せず、参照のみで渡すことをお勧めします。

于 2012-07-21T18:50:56.480 に答える
2

あなたの配列はかなり大きいです。単一のDungeon重みは、約 3 * sizeof(int) + 5 * 5 * 30 * 50 * sizeof(Cell) であり、おそらく 1200000 バイト*、つまり 1 メガバイト以上です。特に複数置く場合は、スタックに置くのが大変かもしれません。

私の提案は、すべての制限を取り除き、std::vector配列の代わりに s を使用することです。これにより、ストレージにヒープが使用され、問題が解決され、無制限の部屋が提供されます**!


*sizeof(Cell)はおそらく 32 前後です: 4 つの float から 16 バイト、bool 用に 1 バイト、vector 用に 12 ~ 16 バイト、さらに 4 バイト境界に揃えるためのパディング。

** まあ、利用可能なメモリ、またはオペレーティング システムによって制限されます。

于 2012-07-21T18:51:36.063 に答える
0

Windows を使用している場合は、考慮してください

http://msdn.microsoft.com/en-us/library/tdkhxaks(v=vs.100).aspx

デフォルトのスタックサイズを増やす

于 2012-07-21T18:49:13.833 に答える
0

大量のデータにはヒープを使用し、コンテナーにはライブラリを使用します。たとえば、boost と qt を見てください。スタックの場合: スタック オブジェクトは、含まれているコンテキストが離れるとすぐに破棄されます。コンテキストは次のとおりです: 関数、オブジェクトの有効期間、間の単純なコード ブロック{}

スタック サイズについて: Linux では、通常、約 . Windows では 8 Mb 32 Mb ただし、これらの値は変更できるため、マシンによって異なる場合があります

于 2012-07-21T18:53:50.727 に答える