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

细胞.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::vectors 而不是数组。它使用堆进行存储,解决您的问题为您提供无限的房间**!


*sizeof(Cell)大概是 32 左右:四个浮点数的 16 个字节,一个布尔值一个字节,一个向量 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 回答