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 数组更改为 new
或 malloc
,将它们移动到堆内存而不是堆栈中。
完成后不要忘记释放它们。
【讨论】:
我建议将您的CreatureStack
s 存储在智能指针中,例如boost::shared_ptr
,这样您就不必记住删除它们。 boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm
或者 CreatureStacks 的 std::vector 可能更容易,因为它会自行释放 :)
您不应该建议人们使用 malloc() 为 C++ 对象分配存储空间。以上是关于C++ 堆栈溢出的主要内容,如果未能解决你的问题,请参考以下文章