2010-06-11 4 views
5

Voici un code:C++ débordement de la pile

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(){}; 

J'ai posté chaque ligne de code qui exécute jusqu'à ce que le programme se bloque. Ce code s'est bien passé pendant longtemps, j'ai ajouté des choses qui ne s'exécutent même pas après le code que j'ai posté ici, et bam, un débordement de pile qui se produit à GameEngine::loadData() ligne: CreatureStack p2Stacks[20]; ne va pas disparaître. Qu'est-ce que je fais mal ici? Est-ce tout ce que la pile peut gérer? J'ai augmenté la taille de la pile dans Visual Studio et j'ai obtenu l'erreur de partir, mais cela a considérablement ralenti les choses, alors comment puis-je trouver la source du problème et y remédier?

+0

Quelle est la taille de ces objets que vous stockez sur la pile? (Comme CreatureStack, Battlefield, RuleSet, etc.) –

+2

Etes-vous sûr de ne pas appeler 'loadData()' (ou 'playGame()') de manière récursive? – sth

+0

Vous devez utiliser un débogueur et imprimer une trace de pile. Cela vous dira si le problème est une récurrence infinie (et quel est le cycle d'appel) ou si la profondeur des appels est petite et le problème est la quantité de données stockées dans la pile elle-même. –

Répondre

4

De toute évidence, CreatureStack est un objet volumineux. Vous en allouez 20 sur la pile. Résultat: dépassement de pile.

Au lieu de cela, passez à new ou malloc pour votre tableau de CreatureStack, en les déplaçant dans la mémoire du tas au lieu de la pile. N'oubliez pas de les libérer lorsque vous avez terminé.

+1

Je suggère de stocker votre 'CreatureStack's dans un pointeur intelligent, comme' boost :: shared_ptr', de sorte que vous n'avez pas à vous souvenir de les supprimer. http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm –

+6

Ou un vecteur std :: de CreatureStacks pourrait être plus facile puisqu'il va se libérer :) – Peter

+0

Vous ne devriez pas suggérer des gens à utilisez malloc() pour allouer du stockage pour un objet C++. –

Questions connexes