2010-06-11 169 views
5

下面是一些代码:C++堆栈溢出

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

我已经发布的每行代码执行,直到程序崩溃。这段代码运行良好很长一段时间,我添加了一些甚至没有执行的东西,直到我在这里发布的代码之后,bam,发生在GameEngine::loadData()行的栈溢出:CreatureStack p2Stacks[20];不会消失。我在这里做错了什么?所有的堆栈都可以处理吗?我在Visual Studio中增加了堆栈大小,并让错误消失,但是这大大降低了速度,所以我该如何解决问题的根源并解决该问题?

+0

这些对象在堆栈中存储的大小是多少? (Like CreatureStack,Battlefield,RuleSet等) – 2010-06-11 03:18:27

+2

你确定你不是以某种方式递归调用'loadData()'(或'playGame()')吗? – sth 2010-06-11 03:21:48

+0

您应该使用调试器并打印堆栈跟踪。这会告诉你,问题是无限递归(以及调用周期是什么),或者调用的深度很小,问题是堆栈本身存储的数据量。 – 2010-06-11 07:42:30

回答

4

显然,CreatureStack是一个大对象。 您正在分配中的20个。结果:堆栈溢出。

改为将newmalloc替换为您的CreatureStack阵列,将它们移入堆内存而不是堆栈。

不要忘记完成后释放它们。

+1

我建议将你的'CreatureStack'存储在一个智能指针中,比如'boost :: shared_ptr'so,你不必记得删除它们。 http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm – 2010-06-11 03:39:19

+6

或者CreatureStacks的std :: vector可能会更容易,因为它会自行释放:) – Peter 2010-06-11 04:11:33

+0

您不应该建议人们使用malloc()为C++对象分配存储空间。 – 2014-11-03 11:22:35