C++ 堆栈溢出

Posted

技术标签:

【中文标题】C++ 堆栈溢出【英文标题】:C++ stack overflow 【发布时间】: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())吗? 您应该使用调试器并打印堆栈跟踪。这将告诉您问题是无限递归(以及调用周期是什么),或者调用深度是否很小并且问题是存储在堆栈本身中的数据量。 【参考方案1】:

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

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

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

【讨论】:

我建议将您的CreatureStacks 存储在智能指针中,例如boost::shared_ptr,这样您就不必记住删除它们。 boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm 或者 CreatureStacks 的 std::vector 可能更容易,因为它会自行释放 :) 您不应该建议人们使用 malloc() 为 C++ 对象分配存储空间。

以上是关于C++ 堆栈溢出的主要内容,如果未能解决你的问题,请参考以下文章

C++ 堆栈溢出

有没有办法在运行时检测堆栈溢出? (c++)

C++ 堆栈溢出初始化数组

我在 C++ 程序中遇到堆栈溢出异常

过深的 C++ 类层次结构会导致堆栈溢出吗?

如何在 c / c++ 程序中检测可能/潜在的堆栈溢出问题?