使用2D数组的C++ Visual Studio堆栈溢出

use*_*521 8 c++ stack-overflow visual-studio-2010

我正在使用Visual Studio 2010 Win 8.我有一个类,我正在制作一个2D数组来保存游戏的游戏数据.

创建一个空白控制台应用程序并生成main.cpp并添加此代码.使用360 for MAP_SIZE导致堆栈溢出使用359不会.为什么会这样?我希望有一个更大尺寸的阵列.我想要2000 - 10,000这样的理想选择.

#define MAP_SIZE 360

typedef unsigned short ushort;
typedef unsigned long ulong;

struct Tile
{
    ushort baseLayerTileID;
    ulong ownerID;
};

class Server
{
private:
    Tile _map[MAP_SIZE][MAP_SIZE];
};


int main()
{
    Server s;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

R. *_*des 8

我的估计sizeof(Tile)值为8或更高.这意味着sizeof(Server)至少360*360*8 = 1036800,即0.99 MB.堆栈通常很小,1MB是常见的默认大小.您应该在堆上分配切片,也许使用std::vector.

class Server
{
public:
    Server() : _map(MAP_SIZE * MAP_SIZE) {}
private:
    std::vector<Tile> _map; // position [i][j] is at [i*MAP_SIZE+j]
};
Run Code Online (Sandbox Code Playgroud)


Jon*_*ood 5

您正在Tile堆栈中分配一个360 x 360 对象的数组.从一开始就是一个坏主意.您在堆栈上分配了一个非常大的内存块.堆栈不适用于此类用途.

如果您只需要一个实例并且事先知道大小,那么这个内存应该是静态的,或者您应该从堆中分配它(使用new或甚至malloc()).

考虑使用构造函数来Server分配内存,new而不是按照它的方式进行操作.