C++堆栈溢出

5

这里是一些代码:

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

我已经发布了每一行代码,直到程序崩溃。这段代码长时间运行正常,我添加了一些在这里发布的代码之后才执行的东西,然后就出现了堆栈溢出,发生在GameEngine::loadData()CreatureStack p2Stacks[20];行。我做错了什么?这是栈可以处理的全部吗?我增加了Visual Studio中的堆栈大小,使错误消失,但这会严重减慢速度,那么如何找到问题的根源并解决它呢?

你在堆栈中存储的对象有多大?(例如CreatureStack、Battlefield、RuleSet等) - James McNellis
2
你确定你没有以某种方式递归调用了 loadData()(或 playGame())吗? - sth
你应该使用调试器并打印堆栈跟踪。这将告诉你问题是否是无限递归(以及调用循环是什么)或者调用深度很小,问题在于存储在堆栈中的数据量。 - David Rodríguez - dribeas
1个回答

4

显然,CreatureStack是一个大对象。

你正在在堆栈上分配20个它们。结果:堆栈溢出。

相反,改用newmalloc为CreatureStack的数组分配内存,将它们移动到堆内存中。

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


1
我建议您将CreatureStack存储在智能指针中,例如boost::shared_ptr,这样您就不必记得删除它们了。http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm - Josh Townzen
6
或者一个CreatureStacks的std::vector可能更容易,因为它会自动释放 :) - Peter
你不应该建议人们使用malloc()来为C++对象分配存储空间。 - Igor Levicki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接