2010-06-11 9 views
5

Hier ist ein Code:C++ Stapelüberlauf

void main() 
{ 
    GameEngine ge("phil", "anotherguy"); 
    string response; 
    do { 
     ge.playGame(); 
     cout << endl << "Do you want to (r)eplay the same battle, (s)tart a new battle, or (q)uit? "; 
     cin >> response; 
    } while(response == "r" || response == "R" || response == "s" || response == "S"); 
} 

GameEngine::GameEngine(string name1, string name2) 
{ 
    p1Name = name1; 
    p2Name = name2; 
} 

void GameEngine::playGame() 
{ 
    cout << "PLAY GAME" << endl; 
    Army p1, p2; 
    Battlefield testField; 
    RuleSet rs; 

    int xSize = 13; // Number of rows 
    int ySize = 13; // Number of columns 

    loadData(p1, p2, testField, rs, xSize, ySize); 

    ... 
} 

void GameEngine::loadData(Army& p1, Army& p2, Battlefield& testField, RuleSet& rs, int& xSize, int& ySize) 
{ 
    string terrain = BattlefieldUtils::pickTerrain(); 
    string armySplit[14];//id index 1 
    string ruleSplit[19];//in index 7 
    string armyP1, armyP2, ruleSet; 
    Skill p1Skills[8]; 
    Skill p2Skills[8]; 
    CreatureStack p1Stacks[20]; 
    CreatureStack p2Stacks[20]; 

    ... 
} 

CreatureStack(){quantity = 0; isLive = false; id = -1;}; 

Army(){}; 

Battlefield(){}; 

RuleSet(){}; 

ich jede Zeile Code geschrieben haben, die bis in die Programmabstürze ausführt. Dieser Code lief für eine lange Zeit gut, ich fügte einige Sachen hinzu, die nicht einmal bis weit nach dem Code ausgeführt werden, den ich hier gepostet habe, und bam, ein Stapelüberlauf, der bei GameEngine::loadData() Zeile: auftritt, wird nicht verschwinden. Was mache ich hier falsch? Ist das alles, was der Stapel handhaben kann? Ich habe die Stack-Größe in Visual Studio erhöht und den Fehler beseitigt, aber das hat die Dinge erheblich verlangsamt. Wie komme ich also zur Ursache des Problems und behebe es?

+0

Wie groß sind diese Objekte, die Sie auf dem Stapel speichern? (Wie CreatureStack, Battlefield, RuleSet, etc.) –

+2

Sind Sie sicher, dass Sie 'loadData()' (oder 'playGame()') nicht irgendwie rekursiv aufrufen? – sth

+0

Sie sollten einen Debugger verwenden und eine Stapelüberwachung drucken. Das wird Ihnen sagen, ob das Problem eine unendliche Rekursion ist (und was der Aufrufzyklus ist) oder ob die Tiefe der Aufrufe klein ist und das Problem die Menge an Daten ist, die im Stapel selbst gespeichert sind. –

Antwort

4

CreatureStack ist eindeutig ein großes Objekt. Sie ordnen 20 davon auf dem Stapel zu. Ergebnis: Stapelüberlauf.

Wechseln Sie stattdessen zu new oder malloc für Ihr Array von CreatureStacks und verschieben Sie sie in den Heapspeicher statt in den Stack.

Vergessen Sie nicht, sie zu löschen, wenn Sie fertig sind.

+1

Ich würde vorschlagen, Ihre 'CreatureStack's in einem Smart Pointer zu speichern, wie zum Beispiel' boost :: shared_ptr'so, dass Sie nicht daran denken müssen, sie zu löschen. http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm –

+6

Oder ein std :: vector von CreatureStacks könnte einfacher sein, da es sich selbst befreien wird :) – Peter

+0

Sie sollten Leuten nicht vorschlagen Verwenden Sie malloc() zum Zuweisen von Speicher für ein C++ - Objekt. –