C ++ Visual Studio-Stapelüberlauf mit 2D-Array

8

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%     
user441521 20.12.2012, 18:08
quelle

5 Antworten

8

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 .

%Vor%     
R. Martinho Fernandes 20.12.2012, 18:11
quelle
5

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.

    
Jonathan Wood 20.12.2012 18:12
quelle
4

Der Stapel hat eine begrenzte Größe. Wenn Sie ein großes Array halten müssen, verwenden Sie die dynamische Zuordnung.

    
K-ballo 20.12.2012 18:10
quelle
4

Sie haben einen Typ erstellt, der ~ 1 MB Stapelspeicher pro Instanz benötigt, der offensichtlich größer ist, als Ihr Stapel aufnehmen kann.

  • Die portable Option besteht darin, von einem festen Array zu einem dynamisch zugewiesenen oder zu einem Vektortyp zu wechseln.
  • Die nicht portable Option besteht darin, die Stapelgröße in Ihrer Anwendung zu erhöhen (was wiederum die Größe des Stapels für alle Threads erhöht)
user7116 20.12.2012 18:11
quelle
0

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

ist
  • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Eigenschaften aus dem Menü.
  • gehe 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.

    
Muhammad El Nakeep 01.02.2014 00:40
quelle