2010-06-11 16 views
5

Aquí hay un código:C++ desbordamiento de pila

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

He publicado cada línea de código que se ejecuta hasta que el programa se bloquea. Este código funcionó bien durante mucho tiempo, agregué algunas cosas que ni siquiera se ejecutan hasta mucho después del código que publiqué aquí, y bam, un desbordamiento de pila que ocurre en la línea GameEngine::loadData(): CreatureStack p2Stacks[20]; no desaparecerá. ¿Qué estoy haciendo mal aquí? ¿Eso es todo lo que la pila puede manejar? Aumenté el tamaño de la pila en Visual Studio y obtuve el error de desaparecer, pero eso disminuyó considerablemente las cosas, así que ¿cómo puedo llegar al origen del problema y corregirlo?

+0

¿Qué tan grandes son estos objetos que está almacenando en la pila? (Como CreatureStack, Battlefield, RuleSet, etc.) –

+2

¿Estás seguro de que de alguna manera no estás llamando 'loadData()' (o 'playGame()') recursivamente? – sth

+0

Debe usar un depurador e imprimir un seguimiento de pila. Eso le dirá si el problema es la recursión infinita (y cuál es el ciclo de la llamada) o si la profundidad de las llamadas es pequeña y el problema es la cantidad de datos almacenados en la pila misma. –

Respuesta

4

Claramente, CreatureStack es un objeto grande. Está asignando 20 de ellos en la pila. Resultado: desbordamiento de pila.

En su lugar, cambie a new o malloc para su matriz de CreatureStack, moviéndolos a la memoria del montón en lugar de a la pila.

No olvides liberarlos cuando haya terminado.

+1

Te sugiero que guardes tus 'CreatureStack's en un puntero inteligente, como' boost :: shared_ptr'so, de modo que no tengas que acordarte de borrarlos. http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm –

+6

O un std :: vector de CreatureStacks podría ser más fácil ya que se liberará :) – Peter

+0

No debe sugerir a las personas use malloc() para asignar almacenamiento para un objeto C++. –

Cuestiones relacionadas