【问题标题】:C++ stack overflowC++ 堆栈溢出
【发布时间】:2011-03-02 11:45:16
【问题描述】:

这里有一些代码:

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 中增加了堆栈大小并让错误消失了,但这大大减慢了速度,那么我该如何找到问题的根源并解决它?

【问题讨论】:

  • 您在堆栈中存储的这些对象有多大? (如 CreatureStack、Battlefield、RuleSet 等)
  • 你确定你没有以某种方式递归调用loadData()(或playGame())吗?
  • 您应该使用调试器并打印堆栈跟踪。这将告诉您问题是无限递归(以及调用周期是什么),或者调用深度是否很小并且问题是存储在堆栈本身中的数据量。

标签: c++ stack-overflow


【解决方案1】:

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

相反,将您的 CreatureStack 数组更改为 new 或 malloc,将它们移动到堆内存而不是堆栈中。

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

【讨论】:

  • 我建议将您的CreatureStacks 存储在智能指针中,例如boost::shared_ptr,这样您就不必记住删除它们。 boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm
  • 或者 CreatureStacks 的 std::vector 可能更容易,因为它会自行释放 :)
  • 您不应该建议人们使用 malloc() 为 C++ 对象分配存储空间。
猜你喜欢
  • 2012-12-20
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多