如何摆脱堆栈溢出错误

时间:2012-07-21 18:44:27

标签: c++ arrays stack-overflow

当我创建Dungeon类的实例时,我收到了堆栈溢出错误。我觉得这是因为我的地牢课创造了一系列房间,我的房间创造了一系列细胞。我唯一的问题是我以前做过这件事并且从未遇到过这个问题。那么这次我做错了什么?我的阵列太大了吗?我可以把我的房间阵列最多[5] [3],但我希望它有一个[5] [5]大小的房间。这不可能吗?

我知道堆栈溢出错误是指堆栈内存不足但我怎么知道何时退出堆栈并重新开始新的?或者什么东西从那堆栈中取出来?

这是关于如何设置这三个类的代码(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

Room.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 个答案:

答案 0 :(得分:2)

您的Cell约为32个字节(或多一点,具体取决于vector<float>的大小)。每间客房有1500个房间。每个地牢有25个房间。因此,每个Dungeon至少需要32 x 1500 x 25 = 1.2 MB。这是非常大的,但如果动态分配结构通常不是主要问题。如果您尝试在堆栈上创建本地实例,那么您可能很容易炸掉堆栈。

所以,动态分配你的Dungeons,你应该没问题。不要将它们创建为局部变量。

您可能会认为隐藏复制构造函数是个好主意,这样您就无法通过引用来传递Dungeon值。

答案 1 :(得分:2)

你的阵列很大。单个Dungeon权重约为3 * sizeof(int)+ 5 * 5 * 30 * 50 * sizeof(Cell),其可能大约为1200000字节*,即大于1兆字节。这可能是很多东西放在堆栈上,特别是如果你放了多个。

我的建议是摆脱所有限制并使用std::vector而不是数组。它使用堆存储,解决您的问题为您提供无限的房间**!


* sizeof(Cell)可能是四个浮点数的32:16字节,bool的一个字节,矢量的12-16个字节,加上填充以对齐4个字节的边界。

**嗯,受可用内存或操作系统的限制。

答案 2 :(得分:0)

如果您正在使用Windows,请考虑

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

增加默认堆栈大小

答案 3 :(得分:0)

将堆用于大量数据并使用库作为容器。比如说看看boost和qt。对于堆栈:只要包含上下文,就会销毁堆栈对象。 上下文可以是:函数,对象生存期,{}

之间的简单代码块

关于堆栈大小:在Linux上你通常有大约。 Windows 32 Mb上8 Mb 但您可以更改这些值,因此它们可能在您的计算机上有所不同