Ich benutze Visual Studio 2010 Win 8. Ich habe eine Klasse, wo ich ein 2D-Array mache, um Spieldaten für ein Spiel zu halten.
Erstellen Sie eine leere Konsolenanwendung und machen Sie main.cpp und fügen Sie diesen Code hinzu. Die Verwendung von 360 für MAP_SIZE verursacht einen Stapelüberlauf, der 359 nicht verwendet. Warum sollte das sein? Ich suche nach einem viel größeren Array. Ich möchte etwas wie 2000 - 10000 im Idealfall.
%Vor% Meine Schätzungen setzen sizeof(Tile)
auf 8 oder mehr. Das heißt sizeof(Server)
ist mindestens 360 * 360 * 8 = 1036800, was 0,99 MB ist. Der Stapel ist normalerweise klein und 1 MB ist eine übliche Standardgröße. Sie sollten stattdessen die Kacheln auf dem Heap zuweisen, möglicherweise mit std::vector
.
Sie ordnen ein Array von 360 x 360 Tile
-Objekten auf dem Stapel zu. Dies ist eine schlechte Idee von Anfang an. Ihnen wird ein sehr großer Speicherblock auf dem Stapel zugewiesen. Der Stapel ist nicht für diese Art der Verwendung vorgesehen.
Dieser Speicher sollte entweder statisch sein, wenn Sie nur eine Instanz benötigen und die Größe im Voraus kennen, oder Sie sollten sie vom Heap zuweisen (mit new
oder sogar malloc()
).
Überlegen Sie, ob der Konstruktor für Server
den Speicher mit new
reserviert, anstatt es so zu machen, wie Sie es tun.
Sie haben einen Typ erstellt, der ~ 1 MB Stapelspeicher pro Instanz benötigt, der offensichtlich größer ist, als Ihr Stapel aufnehmen kann.
Die Standardstapelgröße beträgt 1 MB. Ihre Strukturgröße = ushort (2bytes) + ulong (4byte) = 6 Bytes, die der Compiler für die Strukturausrichtung in 8 Bytes konvertiert. also 8 * 360 * 360 = 1036800 Bytes, marginal über 1MB
Es gibt 3 Lösungen:
1- Kraftstopausrichtung:
%Vor%Dies ermöglicht eine maximale MAP_SIZE = sqrt (1024 * 1024/6) = 418, dies ermöglicht also eine größere Kartengröße, aber nicht die gewünschte Größe
2 - Sie können Visual Studio-Einstellungen ändern, damit Compiler und Linker mehr als 1 MB im Stapel verwenden können: Sie müssen es ändern, um die maximale Kartengröße zu erreichen, die Sie benötigen, die 8 * 10000 * 10000 ~ 800MB
istgehe zu den Konfigurationseigenschaften- & gt; C / C ++ - & gt; Befehlszeile, fügen Sie diesen Parameter hinzu:
/ F801000000
Gehe zu Konfigurationseigenschaften- & gt; Linker- & gt; Befehlszeile, füge diesen Parameter hinzu
/ STACK: 801000000
Fertig!
3- Die dritte Lösung ist ein dynamisches Array, das anstelle des statischen Arrays über den Heap verteilt wird, wie alle gesagt haben.
Tags und Links c++ visual-studio-2010 stack-overflow