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)
我的估计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)
您正在Tile堆栈中分配一个360 x 360 对象的数组.从一开始就是一个坏主意.您在堆栈上分配了一个非常大的内存块.堆栈不适用于此类用途.
如果您只需要一个实例并且事先知道大小,那么这个内存应该是静态的,或者您应该从堆中分配它(使用new或甚至malloc()).
考虑使用构造函数来Server分配内存,new而不是按照它的方式进行操作.