我正在制作一个控制台应用程序游戏 (C#),并且 运行 陷入 Stack Overflow 错误。如何避免?
I'm making a Console Application Game (C#), and I'm running into Stack Overflow Error. How to avoid?
我的游戏针对游戏的每个状态都有多个方法,这些方法在适用的情况下相互调用。这会在一段时间后导致堆栈溢出错误。有什么办法可以避免这种情况,也许是解决方法?
编辑:正如下面的用户所建议的,我的代码基本上是:
void a()
{
b();
}
void b()
{
a();
}
在这段代码中,我打算使用递归来改变游戏状态。
有什么方法可以重置堆栈,这样它就不会导致溢出错误,然后 return 方法。
可能的修复:(这只是延迟了 Stack Overflow 还是已经消除了它?)
int tracker;
void start()
{
a();
resetter();
}
void a()
{
b();
}
void b()
{
if (tracker > 10)
{
tracker = 0;
return;
}
else
tracker++;
a();
}
void resetter()
{
start();
}
我假设你正在做类似的事情:
void A()
{
B();
}
void B()
{
A();
}
根据定义,这将始终导致堆栈溢出。这主要是因为堆栈的工作方式。假设您首先调用 A
,当此方法调用 B
时,此方法的 parameters/variables/... 将被放入堆栈。
然后,这个方法(B
),调用'A';发生的那一刻,它将把它的参数放在堆栈上。
方法return秒后,栈上的数据被清除。但是这两种方法永远不会 return...他们一直在互相调用,比如:
A()
--> B()
--> A()
--> B()
--> A()
--> B()
--> A()
--> B()
--> A()
如您所见,越来越多的东西被放入堆栈,导致溢出。
你会希望你的递归停止来解决这个问题。您可以通过在任一方法中引入停止条件来做到这一点,这将 return
.
如果您希望更具体地回答您的问题,请添加一些代码。但是既然你说的是A调用B,B调用A,那么上面的伪代码应该就足够了。
我的游戏针对游戏的每个状态都有多个方法,这些方法在适用的情况下相互调用。这会在一段时间后导致堆栈溢出错误。有什么办法可以避免这种情况,也许是解决方法?
编辑:正如下面的用户所建议的,我的代码基本上是:
void a()
{
b();
}
void b()
{
a();
}
在这段代码中,我打算使用递归来改变游戏状态。 有什么方法可以重置堆栈,这样它就不会导致溢出错误,然后 return 方法。
可能的修复:(这只是延迟了 Stack Overflow 还是已经消除了它?)
int tracker;
void start()
{
a();
resetter();
}
void a()
{
b();
}
void b()
{
if (tracker > 10)
{
tracker = 0;
return;
}
else
tracker++;
a();
}
void resetter()
{
start();
}
我假设你正在做类似的事情:
void A()
{
B();
}
void B()
{
A();
}
根据定义,这将始终导致堆栈溢出。这主要是因为堆栈的工作方式。假设您首先调用 A
,当此方法调用 B
时,此方法的 parameters/variables/... 将被放入堆栈。
然后,这个方法(B
),调用'A';发生的那一刻,它将把它的参数放在堆栈上。
方法return秒后,栈上的数据被清除。但是这两种方法永远不会 return...他们一直在互相调用,比如:
A()
--> B()
--> A()
--> B()
--> A()
--> B()
--> A()
--> B()
--> A()
如您所见,越来越多的东西被放入堆栈,导致溢出。
你会希望你的递归停止来解决这个问题。您可以通过在任一方法中引入停止条件来做到这一点,这将 return
.
如果您希望更具体地回答您的问题,请添加一些代码。但是既然你说的是A调用B,B调用A,那么上面的伪代码应该就足够了。